s081 1 作業系統原理

2021-10-02 05:44:45 字數 2497 閱讀 1937

實驗1需要我們呼叫unix作業系統保持出的介面,因此首先需要了解unix作業系統有關的知識。

int pid = fork();

if(pid > 0) else if(pid == 0) else

在下面的例子中,輸出是:

也可能出現另外的情況,具體取決於父程序還是子程序首先進入其printf呼叫。

char *ar**[3];

ar**[0] = "echo";

ar**[1] = "hello";

ar**[2] = 0;

exec("/bin/echo", ar**);

printf("exec error\en");

該片段將呼叫程式以程式/ bin / echo的例項替換,引數列表為echo hello。 大多數程式會忽略第乙個引數,這通常是程式的名稱

* 檔案描述符是乙個小的整數,表示程序可以從中讀取或寫入的核心管理的物件。 程序可以通過開啟檔案,目錄或裝置,或通過建立管道,或通過複製現有描述符來獲取檔案描述符。 為簡單起見,我們通常將檔案描述符所指的物件稱為「檔案」; 檔案描述符介面抽象了檔案,管道和裝置之間的差異,使它們看起來都像位元組流。

* 在內部,xv6核心使用檔案描述符作為每個程序表的索引,因此每個程序都有乙個從零開始的檔案描述符專用空間。 按照慣例,程序從檔案描述符0(標準輸入)讀取,將輸出寫入檔案描述符1(標準輸出),並將錯誤訊息寫入檔案描述符2(標準錯誤)。 就像我們將看到的那樣,shell利用約定來實現i / o重定向(redirection)和管道(pipelines)。 shell確保始終開啟三個檔案描述符(user / sh.c:151),預設情況下,這三個檔案描述符是控制台(console)的檔案描述符。

char buf[512];

int n;

for(;;)

if(write(1, buf, n) != n)

}

在**片段中要注意的重要一點是cat不知道它是從檔案,控制台還是管道中讀取。 同樣,cat不知道它是要列印到控制台,檔案還是其他地方。 使用檔案描述符以及檔案描述符0是標準輸入和輸出檔案描述符是標準輸出的約定可以實現cat的簡單實現。close系統呼叫將釋放檔案描述符,以供將來的open,pipe或dup系統呼叫重用。 新分配的檔案描述符始終是當前程序中編號最小的未使用的描述符。
檔案描述符和fork互動使i/o重定向易於實現。fork會複製父檔案的檔案描述符表及其記憶體,以便子檔案與父檔案開啟完全相同的檔案。 exec系統呼叫替換了呼叫程序的記憶體,但保留了其檔案表。 此行為允許shell通過分叉,重新開啟選定的檔案描述符,然後exec新程式來實現i / o重定向。 這是shell為cat mknod在檔案系統中建立乙個檔案,但是該檔案沒有內容。 但是,檔案的元資料會將其標記為裝置檔案,並記錄主裝置號和次裝置號(mknod的兩個引數),它們唯一地標識核心裝置。 當以後有乙個程序開啟檔案時,核心會將read和write系統呼叫轉換到核心裝置的讀寫實現,而不是將它們轉換到檔案系統。

fstat系統呼叫得到有關檔案描述符引用的物件的資訊。此物件資訊返回結構體stat,定義在

stat.h (kernel/stat.h):

#define t_dir 1 // directory

#define t_file 2 // file

#define t_device 3 // device

struct stat ;

檔名與檔案不同; 同乙個檔案(稱為inode)可以具有多個名稱(稱為links)。

link系統呼叫將建立另乙個檔名稱,該名稱引用與現有檔案相同的inode。 下面的程式片段建立了乙個名為a又為b的新檔案。

open("a", o_create|o_wronly);

link("a", "b");

讀取,寫入a與讀取,寫入到b相同。 每個inode由唯一的inode編號標識。 在上面的**片段之後,可以通過檢查fstat的結果確定a和b是否引用相同的檔案:兩者將返回相同的inode編號(ino),並且nlink將變為2。

unlink系統呼叫從檔案系統中刪除乙個名稱。 僅當檔案的link計數為零且沒有檔案描述符引用該檔案時, 才會將inode和其所在的磁碟空間清除。

因此當執行了

unlink("a");
之後,使用名稱b任然能夠訪問檔案。

下面的程式片段是一種慣用的方式建立乙個臨時inode。

fd = open("/tmp/xyz", o_create|o_rdwr);

unlink("/tmp/xyz");

unix結合了檔案描述符,管道和方便的shell語法以對其進行操作,這是編寫通用可復用程式的重大進步。這是unix的強大功能和廣泛使用的原因,外殼程式是第一種所謂的「指令碼語言」。unixit系統呼叫介面在bsd,linux,和mac osx 上廣泛使用。

技術交流2群:713385260

作業系統原理 章節測試 作業系統原理

第一章 單元測試 1 單選題 允許多個使用者將若干個作業提交給計算機系統集中處理的作業系統稱為 選項 a 分時作業系統 b 實時作業系統 c 網路作業系統 d 批處理系統 答案 批處理系統 2 單選題 是指兩個或兩個以上的活動或事件在同一時間間隔內發生。選項 a 共享 b 並行 c 併發 d 同步 ...

作業系統原理 作業系統概述

1.2 作業系統的定義和作用 1.3 作業系統的主要特性 1.4典型作業系統的架構 1.5 作業系統的分類 假設有乙個簡單的c語言程式 helloworld,我們通過這個簡單程式的執行過程來看一下作業系統對這個程式的過程有哪些支援!include intmain int argc,char ar 這...

作業系統原理

第一章 緒論 1.1 1 對問題的形式化定義稱為數學模型,而對問題的求解方法的形式描述稱為演算法。1.2.作業系統負責管理計算機系統的硬體和軟體資源並控制整個計算機的工作流程。作業系統的核心任務是系統資源分配,控制和協調併發活動。作業系統具有如下資源管理功能 1.處理機分配2.儲存管理3.裝置管理4...