天天看點

《unix進階環境程式設計》讀書摘記系列之1——Unix基礎知識

Unix基礎知識

一、Unix體系結構

Os控制計算機硬體資源,提供程式運作環境,一般稱其為核心,其相對較小,位于環境的中心。

核心的接口稱為系統調用(system call);公用函數庫建構在系統調用接口之上;應用軟體即可使用公用函數庫,也可使用系統調用。Shell是一種特殊的應用程式,其為運作其它應用程式提供了一個接口。

二、登入

1.登入名

系統在其密碼檔案(/etc/passwd)中檢視登入名。密碼檔案中登入項由7個以冒号分隔的字段組成,如:

Sar   :x       :205        :105     :Stephen Rago :/home/sar :/bin/ksh

登入名:加密密碼:數值使用者ID:數值組ID:注釋字段    :起始目錄 :shell程式

2.Shell

Shell名 路徑 描述
Bourne shell /bin/sh 幾乎每一個現有的Unix系統都提供Bourne shell
Bourne-again shell /bin/bash 其是GNU shell,所有Linux系統都提供這種shell
C shell /bin/csh 在第6版shell而非Bourne shell基礎上構造。
Korn shell /bin/ksh 是Bourne shell的後繼者,它首先在SVR4中提供
TENEX C shell /bin/tcsh C shell的加強版,在c shell的基礎上增加了很多特征,常被用來替換c shell

三、檔案和目錄

1.檔案系統

Unix檔案系統是目錄與檔案組成的一種層次結構,目錄的起點稱為根(root),其名字是一個字元/。目錄是一個包含許多目錄項的檔案,在邏輯上,可以認為每個目錄項都包含一個檔案名,同時還包含說明該檔案屬性的資訊。檔案屬性指檔案類型、檔案大小、檔案所有者、檔案權限以及檔案最後的修改時間等等。

2.檔案名

目錄中的各個名字稱為檔案名;不能出現在檔案名中的字元隻有斜線(/)和空操作符(null)。斜線用來分隔構成路徑名的各檔案名,空操作符用來終止一個路徑名。建立新目錄時會自動建立兩個檔案名:.和..;.指目前目錄,..指父目錄;在最高層次的根目錄中.與..相同。幾乎所有商品化的Unix系統都支援至少255個字元的檔案名。

3.路徑名

一個或多個以斜線分隔的檔案名序列構成路徑名,以斜線開頭的路徑名稱為絕對路徑名,否則稱為相對路徑名。

4.工作目錄

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

5.起始目錄

登入時,工作目錄設定為起始目錄(/home/sar),該起始目錄從密碼檔案中相應使用者的登入項中取得。

四、輸入和輸出

1.檔案描述符

檔案描述符通常是一個小的非負整數,核心用其辨別一個特定程序正在通路的檔案。當核心打開一個已有檔案或建立一個新檔案時,它傳回一個檔案描述符。則在讀、寫檔案時就可使用它。

2.标準輸入、标準輸出和标準出錯

當運作一個新程式時,所有shell都為其打開三個檔案描述符:标準輸入(STDIN_FILENO,0)、标準輸出(STDOUT_FILENO,1)和标準出錯(STDERR_FILENO,2)。

3.不用緩沖的I/O

函數open、read、write、lseek以及close提供了不用緩沖的I/O,這些函數都是用檔案描述符。

4.标準I/O

标準I/O函數庫提供了使我們能夠控制該庫所使用的緩沖風格的函數。标準I/O函數提供一種對不用緩沖I/O函數的帶緩沖的接口,使用标準I/O函數無需擔心如何選取最佳緩沖區大小,标準I/O函數都放在<stdio.h>中。

五、程式和程序

1.程式

程式是存放在磁盤上、處于某個目錄中的一個可執行檔案。可使用6個exec函數中一個由核心載入存儲器并使其執行之。

2.程序和程序ID

程式的執行執行個體稱為程序;Unix系統確定每個程序都有一個唯一的數字辨別符,稱其為程序ID(PID),程序ID總是一非負整數。

3.程序控制

有三個用于程序控制的主要函數:fork、exec和waitpid。Exec函數有6種變體,但常統稱它們為exec函數。

4.線程和線程ID

一個程序隻有一個控制線程,同一時刻隻執行一組機器指令。在一個程序内的所有線程共享同一位址空間、檔案描述符、棧以及與程序相關的屬性。進而各線程在通路共享資料時需要采取同步措施以避免不一緻性。與程序相同,線程也用ID辨別;但線程ID隻在它所屬程序内起作用。

六、出錯處理

C标準定義了兩個函數幫助列印出錯資訊。

#include <string.h>  Char *strerror(int errnum);   傳回值:指向消息字元串的指針

該函數将errnum映射為一個出錯資訊字元串,并傳回此字元串的指針。

#include <stdio.h>  void perror(const char *msg)

該函數基于errno的目前值,在标準出錯上産生一條處所資訊,其首先輸出由msg指向的字元串,然後一個冒号,一個空格,接着是對應于errno值的出錯資訊,最後是一個換行符。

七、使用者辨別

1.使用者ID

密碼檔案登入項中的使用者ID是個數值,它向系統辨別各個不同的使用者。系統管理者在确定一個使用者的登入名的同時,确定其使用者ID;使用者不能更改其使用者ID;每個使用者都有一個唯一的使用者ID。使用者ID為0的使用者為根或超級使用者,超級使用者對系統有自由的支配權。

2.組ID

密碼檔案登入項也包括使用者的組ID,其是一個數值。組ID也是由系統管理者在指定使用者登入名時配置設定的;一般在密碼檔案中有多個記錄項具有相同的組ID。組被用于将若幹使用者分到不用的項目組或部門中去。這種機制允許同組各成員間共享資源

八、信号

信号是通知程序已發生某種情況的一種技術。程序如何處理信号有三種選擇:

(1)    忽略此信号

(2)    按系統預設方式處理,如除0操作,系統預設方式是終止該程序。

(3)    提供一個函數,信号發生時則調用該函數,這被稱為捕捉該信号;隻要提供自編的函數就能知道什麼時候産生了該信号,并按所希望的方式處理它。

産生信号有多種:

(1)    中斷鍵(delete/ctrl+c)或退出鍵(ctrl+/),被用于中斷目前運作的程序。

(2)    調用名為kill的函數。在一個程序中調用此函數就可向另一個程序發送一個信号。

九、時間值

Unix系統一直使用兩種不同的時間值:

(1)    月曆時間:自1970年1月1日00:00:00以來國際标準時間所經過的秒數累計值。這些時間可用于記錄檔案最近一次的修改時間。系統用time_t來儲存這種時間值。

(2)    程序時間:用以度量程序使用的cpu資源,系統用clock_t來儲存這種時間值。

Unix系統使用三個程序時間值來度量一個程序的執行時間:

1.       時鐘時間(real):程序運作的時間總量。

2.       使用者cpu時間(user):執行使用者指令(包括核心程式)時所耗時間。

3.       系統cpu時間(sys):程序執行核心程式所用時間。

使用者cpu時間和系統cpu時間之和常被稱為cpu時間。 (real>sys>user)

十、系統調用和庫函數

應用程式調用系統調用或者庫函數,而很多庫函數則調用系統調用.

系統調用和庫函數之間的另一個差别是:系統調用通常提供一種最小接口,而庫函數通常提供比較複雜的功能。

繼續閱讀