UNIX環境高階程式設計(第1章 UNIX基礎知識)

2021-06-26 01:19:23 字數 2798 閱讀 6662

本章從程式設計人員角度快速瀏覽unix,也為不熟悉unix的程式設計人員簡要介紹unix提供的各種服務。

1.unix體系結構

核心:控制計算機硬體資源,提供程式執行環境的軟體。

核心的介面:系統呼叫。

圖1-1 unix作業系統的體系結構

2.登入

$ cat /etc/passwd

root:x:0:0:root:/root:/bin/bash

口令檔案/etc/passwd中的登入項由7個以冒號分隔的字段組成,分別是:

登入名、加密口令、使用者id、組id、注釋字段、起始目錄以及shell程式。

3.檔案和目錄

3.1檔案系統

unix檔案系統是目錄和檔案組成的一種層次結構,目錄的起點稱為根(root),其名字是乙個字元/

目錄是乙個包含許多目錄項的檔案,每個目錄項都包含乙個檔名,同時包含該檔案屬性資訊。

3.2檔名

目錄中的各個名字稱為檔名。斜線(/)用來分隔構成路徑名的各檔名,空操作符(null)則用來終止乙個路徑名。斜線和空操作符不能出現的檔名中。

建立新目錄時會自動建立兩個檔名:.(稱為點)和..(稱為點點)。其中,.指當前目錄,..則指父目錄。在根目錄中,.和..相同。

3.3路徑名

以斜線開頭的路徑名稱為絕對路徑名,如/usr/lib/lint。不以斜線開頭的稱為相對路徑名,相對路徑名引用相對於當前目錄的檔案。

檔案系統根的名字(/)是乙個特殊的絕對路徑名,它不含檔名。

3.4工作目錄

每個程序都有乙個工作目錄(或稱為當前工作目錄)。所有相對路徑名都從工作目錄開始解釋。

3.5起始目錄

登入時,工作目錄設定為起始目錄,該起始目錄從口令檔案中相應使用者的登入項中取得。

4.輸入和輸出

4.1檔案描述符

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

4.2標準輸入、標準輸出和標準錯誤

當執行乙個新程式時,所有的shell都為其開啟桑檔案描述符:標準輸入,標準輸出以及標準錯誤。

4.3不用緩衝的i/o

函式open,read,write,lseek以及close提供了不用緩衝的i/o。這些函式都使用檔案描述符。

4.4標準i/o

標準i/o函式提供一種對不用緩衝i/o函式的帶緩衝的介面。所有標準i/o函式的原型都包含在標頭檔案stdio.h中。

5.程式和程序

用於程序控制的函式有:fork,exec和waitpid。乙個程序只有乙個控制線程,同一時刻只執行一組機器指令。在乙個程序內的所有執行緒共享同一位址空間、檔案描述符、棧以及與程序相關的屬性。因為它們能訪問同一儲存區,所以各執行緒在訪問共享資料時需要採取同步措施以避免不一致性。

6.出錯處理

當unix函式出錯時,常常返回乙個負值,而且整型變數errno通常被設定為含有附加資訊的乙個值。標頭檔案中定義了符號errno以及可以賦予它的各種常量,這些常量都以字元e開頭。

errno以前使用的定義:extern int errno;

在支援執行緒的環境中,多個執行緒共享程序位址空間,每個執行緒都有屬於自己的區域性errno以避免乙個執行緒干擾另乙個執行緒。

linux支援多執行緒訪問errno,將其定義為:

extern int *__errno_location(void);

#define errno (*__errno_location())

errno的兩條規則:

1>  如果沒有出錯,則其值不會被乙個例程清除。

2>  任一函式都不會將errno值設定為0,在中定義的所有常量都不為0

幫助列印出錯資訊的兩個函式:

#include char *strerror(int errnum);

引數:errnum通常是errno值

返回值:指向訊息字串的指標

#include void perror(const char *msg);

輸出:由msg指向的字串,然後是乙個冒號,乙個空格,接著是對應於errno值的出錯資訊,最後是乙個換行符。

對非致命性錯誤,可嘗試延時重試,以改善應用程式的健壯性。

7.使用者標識

使用者id是個數值,它向系統標識各個不同的使用者。使用者id為0的使用者是超級使用者或根(root)。系統管理員在確定乙個使用者的登入名的同時,確定其使用者id。

組id是乙個數值,也是由系統管理員在確定使用者登入名時分配的。同組的各個成員之間共享資源。

附加組id。大多數unix系統版本還允許乙個使用者屬於另外的組。

8.訊號

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

1>  忽略該訊號。

2>  按系統預設方式處理。

3>  提供乙個函式。

9.時間值

unix系統一直使用兩種不同的時間值:日曆時間和程序時間。

1>  日曆時間

該值是自2023年1月1日00:00:00以來國際標準時間(utc)所經過的秒數累計值。

2>  程序時間

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

當度量乙個程序的執行時間時,unix系統使用三個程序時間值:

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

UNIX高階環境程式設計 第13章 守護程序

守護程序 沒有控制終端,長期執行在後台的程序 void daemonize const char cmd else if pid 0 呼叫setsid以建立乙個新會話 使呼叫程序 a.成為新會話的首程序,b.成為乙個新程序組的組長程序,c.沒有控制終端。setsid struct sigaction...

UNIX環境高階程式設計之第10章 訊號

訊號是軟體中斷.很多比較重要的應用程式都需要處理訊號.訊號提供一種處理非同步時間的方法,例如,終端使用者鍵入中斷鍵,會通過訊號機制停止乙個程式,或及早終止管道中的下乙個程式.首先每個訊號都有乙個名字.這些名字都是以sig開頭.例如,sigabrt是夭折訊號,當程序呼叫abort函式是產生這種訊號.u...

檔案和目錄 UNIX環境高階程式設計 第4章

4.2 stat fstat和lstat函式 int stat const char restrict pathname,struct stat restrict buf int fstat int filedes,struct stat buf int lstat const char restr...