Linux系統程式設計7 UNIX體系結構

2022-05-23 14:18:11 字數 4520 閱讀 2257

嚴格意義上來說,作業系統可以被定義一種軟體,它控制計算機硬體資源,提供程式執行環境。

我們通常將這種軟體稱為核心(kernel)。因為它相對較小。

核心的介面被稱為系統呼叫(system call)。公共函式庫建立在系統呼叫之上。

應用程式既可以使用公共函式庫,也可以使用系統呼叫。

shell是一款特殊的應用程式,為執行其他應用程式提供了乙個介面。

登入:

/etc/password檔案中:有7個由冒號分隔的字段組成。

依次是:登入名,加密口令,數字使用者id,數字組id,注釋字段,起始目錄,shell程式。

檔案和目錄:

檔案系統:是目錄和檔案的一種層次結構,所有東西的起點是根(root)的目錄。這個目錄的名字就叫做「/」。

目錄:是包含目錄項的檔案,每個目錄項都包含乙個檔名,同時還包含說明該檔案屬性的資訊。

檔案屬性:檔案型別,大小,所有者,許可權,最後的修改時間等。

檔名:斜線/和空字元不能出現在檔名中。斜線是用來分隔構成路徑名的各檔名,空字元用來終止乙個檔名;

新建乙個目錄的時候,會自動建立兩個檔名...。點指向當前目錄,點點指向父目錄。最高層次的根目錄中,點和點點相同。

路徑名:由斜線分隔的乙個或多個檔名組成的序列構成了路徑名。以斜線開頭的路徑名稱為絕對路徑。否則就是相對路徑

相對路徑指向相對於當前目錄的檔案。檔案系統中根目錄的名字是乙個特殊的絕對路徑名,它不包含檔名。

工作目錄:每個程序都有乙個工作目錄,有時稱其為當前工作目錄。所有相對路徑名都從工作目錄開始解釋。

輸入和輸出

檔案描述符:通常是乙個非負整數。核心用以標識乙個特定程序正在訪問的檔案。當核心開啟或建立乙個新檔案時,它都返回乙個檔案描述符。

在讀寫檔案時,都可以使用這個檔案描述符。

標準輸入,標準輸出和標準錯誤:每當執行乙個程式時,shell都為其開啟三個檔案描述符。即標準輸入,標準輸出,標準錯誤。

如果不做特殊的處理,這三個描述符都鏈結向終端。大多數shell能夠提供方式,使得三個描述符重定向到指定得檔案中。

不帶緩衝的i/o:函式open,read,write,lseek,close提供了不帶緩衝的i/o;標頭檔案包含了很多unix系統服務的函式原型。

stdin_fileno和stdout_fileno是posix標準的一部分。它們指定了標準輸入和標準輸出的檔案描述符。

標準i/o:標準i/o函式為那些不帶緩衝的i/o函式提供了乙個帶緩衝的介面。使用標準i/o函式無需擔心如何選取最佳的緩衝區大小。還簡化了堆輸入行的處理。

程式和程序

程式:是乙個儲存在磁碟上某個目錄中的可執行檔案。核心使用exec函式將程式讀入記憶體,並執行程式。

程序和程序id:程式執行的例項被稱為程序。unix系統確保每個程序都有乙個唯一的數字識別符號。被稱為程序id。程序id是乙個非負整數。

程序控制:fork,exec,waitpid。exec函式有7類但是被統稱為exec函式。

所以各執行緒在訪問共享資料時需要採取同步措施以避免不一致性。與程序id相同,執行緒也有id標識。執行緒id只在它所屬的程序內起作用。

出錯處理

當unix系統函式出錯時,通常會返回乙個負值。

而整型變數errno通常會被設定為具有特定資訊的值。

檔案中定義了errno以及可以賦與它的各種常量。這些常量都以字元e開頭。

使用者標識

使用者id:是乙個數值,它向系統標識各個不同的使用者。

使用者id為0的使用者為根使用者超級使用者。系統管理員在確定乙個使用者的登入名的同時,確定其使用者id。

使用者不能更改其使用者id。通常每個使用者有乙個唯一的使用者id。

如果乙個程序具有超級使用者特權,則大多數檔案許可權檢查都不再進行。

某些作業系統的功能只向超級使用者提供,超級使用者堆系統有自由的自配權。

組id:口令檔案登入項也包括使用者的組id。它是乙個數值。組id也是有系統管理員在指定使用者登入名時分配的。

組被用於將若干使用者集合到專案或部門中去。這種機制允許同組的各個成員之間共享資源。

組檔案將組名對映為數值得組id。組檔案通常時/etc/group。

使用數值得使用者id和數值得組id設定許可權時歷史上形成的。

對於磁碟上的每個檔案,檔案系統都儲存該檔案所有者的使用者id和組id。

儲存這兩個值只需要4個位元組。校驗許可權期間,比較字串較之比較整數型更消耗時間。

對於使用者而言,使用名字比使用數值更加方便,所以口令檔案包含了登入名和使用者id之間的對映關係。

組檔案則包含了組名和組id之間的對映關係。

附屬組id:除了在口令檔案中對乙個登入名指定乙個組id外,大多數unix系統版本還允許乙個使用者屬於另外一些組。

這一功能時從4.2bsd開始的,它允許乙個使用者屬於多至16個其他的組。

登入時,讀檔案/etc/group,尋找列有該使用者作為其成員的其成員的前16個記錄項就可以得到該使用者的附屬組id。

訊號

訊號用於通知程序發生了某種情況。

程序有三種處理訊號的方式:

1)忽略訊號;

2)按系統預設方式處理:對於除數為0,系統預設方式是終止該程序;

3)提供乙個函式,訊號發生時呼叫該函式,這被稱為捕捉該訊號。通過提供自編的函式,我們就能知道什麼時候產生了訊號,並按期望的方式處理它。

很多情況都會產生訊號,終端鍵盤上有兩種產生訊號的方式。分別為中斷鍵(通常是ctrl+c和delete鍵),退出鍵(ctrl+\)。它們被用於中斷當前執行的程序。

另一種產生訊號的方法是呼叫kill函式。在乙個程序中呼叫此函式就可以向另乙個程序傳送乙個訊號。當向乙個程序傳送訊號時,我們必須是那個程序的所有者或者是超級使用者。

時間值

歷史上,unix系統使用過兩種不同的時間值。

1)日曆時間

該值是自協調世界時(utc)這個特定時間以來所經歷過的秒數累計值。這些時間值可用於記錄檔案最近一次的修改時間等。

系統基礎資料型別time_t用於儲存這種時間值。

2)程序時間

也被稱為cpu時間,用以度量程序使用的**處理器資源。程序時間以始終滴答計算。每秒鐘曾取為50,60或100個時間滴答。

系統基本資料型別clock_t儲存這種時間值。

當度量乙個程序的執行時間時,unix系統為乙個程序維護了3個程序時間值。

時鐘時間

使用者cpu時間

系統cpu時間

時鐘時間又稱為牆上時鐘時間(wall clock time)。它是程序執行的時間總量。其值與系統中同時執行的程序數有關。

使用者cpu時間是執行使用者指令所用的時間量。

系統cpu時間是為該程序執行核心程式所經歷的時間。

每當乙個程序執行乙個系統服務時,如read或write,在核心內執行該服務所花費的時間就計入該程序的系統cpu時間。

使用者cpu時間和系統cpu時間之和常被稱為cpu時間。

系統呼叫和庫函式

所有的作業系統都提供多種服務的入口點,由此程式向核心請求服務。

各種版本的unix實現都提供良好定義、數量有限、直接進入核心的入口點。這些入口點被稱為系統呼叫(system call)

unix所使用的技術是為每個系統呼叫在標準c庫中設定乙個具有同樣名字的函式。

使用者程序用標準c呼叫序列來呼叫這些函式,然後,函式又用系統所要求的技術呼叫相應的核心服務。

應用角度考慮,可將系統呼叫視為c函式。系統呼叫和庫函式都使用函式這一屬於來表示。

實現者的角度來看,系統呼叫和庫函式之間有根本的區別。從使用者角度來說,其區別不重要。

系統呼叫和庫函式都以c函式的形式出現,兩者都為應用程式提供服務。

但是我們應當理解,如果希望的話,我們可以替換庫函式,但是系統呼叫通常是不能被替換的

應用程式既可以呼叫系統呼叫也可以呼叫庫函式。很多庫函式則會呼叫系統呼叫。

系統呼叫通常提供一種最小介面,而庫函式通常提供比較複雜的功能。

unix系統程式設計

popen pclose popen介面定義 include file popen const char command,const char type int pclose file stream popen函式會建立乙個管道,並且建立乙個子程序來執行shell,shell會建立乙個子程序來執行c...

UNIX系統程式設計1

man 你想查詢的內容 如果man你也不會用也不要緊,那你就 man man 一下,呵呵。只可惜好像還沒有翻譯成中文,對於像我這樣英文水平還有待提高的朋友來說讀起來有點麻煩。最後還有乙個好工具就是網路,有什麼不會的google一下好多問題都能解決。好,囉嗦的半天,說歸正傳,免得給大家造成光說不練的印...

Unix系統程式設計()brk,sbrk

在堆上分配記憶體 程序可以通過增加堆的大小來分配記憶體,所謂堆是一段長度可變的連續虛擬記憶體,始於程序的未初始化資料段末尾,隨著記憶體的分配和釋放而增減。通常將堆的當前記憶體邊界稱為 program break 下面也會學習一族函式brk,sbrk和malloc。調整program break br...