unix環境高階程式設計

2021-05-09 02:31:26 字數 2881 閱讀 9635

unix

日曆時間

-- 自1970 年1 月1 日00:00:00 以來的國際標準時間(utc).

程序時間【cpu 時間】

時鐘時間-- 程序執行時間的總量。

使用者cpu 時間-- 執行使用者指令時間量。

系統cpu 時間-- 執行核心所經歷時間。

命令--time

第三章至第七章:

原子操作--

任何乙個要求多於1 個函式呼叫的操作都不能成為原子操作,因

為在兩個函式呼叫之間,核心有可能會臨時掛起該程序.

術語—— 不帶快取指的是每個r e a d 和w r i t e 都呼叫核心中的乙個系統呼叫。這些不帶快取的i / o 函式不是ansi c 的組成部分,但是是p o s i x . 1 和x p g 3 的組成部分。

unix shell

對應三個檔案描述符 :標準輸入,輸出,出錯;

對乙個程序會預定義這三個程序 :標準輸入,輸出,出錯。

檔案i/o 相關函式

: open, create, close, lseek, read, write 等等, 有

核心返回給程序乙個檔案描述符,然後對其進行i/o 操

作; 而標準i/o 庫 返回的則是流,所有的操作也是針對

流進行的。

read

函式-- 網路上的緩衝機制可能會造成返回值小於所要求讀的位元組數;

選擇所讀取buffersize 的大小為8192 的時候,系統時間是最小

的,以後再增加這個大小對系統時間無影響。

標準i/o 提供三種型別的快取 :全快取,行快取,不帶快取。

術語重新整理(flush )說明標準i / o 快取的寫操作 。值得引起注意的是在uxix 環境中,重新整理有兩種意思。在標準i / o 庫方面,重新整理意味著將快取中的內容寫到磁碟上(該快取可以只是區域性填寫的), 在終端驅動程式方面(例如在第11 章中所述的tcflush 函式),重新整理表示丟棄已存在快取中的資料。

典型的儲存器布局:

段] ;# 正文段到底是指什麼?

程序控制:

程序識別符號 包括程序id, 父程序id, 實際使用者id, 有效使用者id, 實際組

id, 有效組id.

程序id

程序id 為0 是排程程序( 交換程序)-- 是核心的一部分,屬於系統進

程; 程序id 為1 是init 程序,由核心呼叫。/etc/init 或/sbin/init. 屬於使用者程序,要以超級使用者特權執行。程序id 為1 是頁精靈程序,此程序負責支援虛存系統的請頁操作,與交換程序一樣也屬於核心程序。

fork

函式:pid_t fork(void);

呼叫一次返回兩次,子程序返回的是0 , 而父程序返回值則是新子程序的程序id. 這樣父程序就擁有了子程序的id, 而子程序可以通過getppid 函式來獲取。這位父,子程序相互通訊建立了條件。

fork, exec 常使用copy-on-write 技術。[fork-exec 稱為spawn]

10.6 節討論如何使用訊號來使父,子程序同步。

fork 兩次避免殭屍程序:

父程序結束後,其子程序怎麼辦?

父程序結束後,核心會檢查所有活動的程序,以判斷他是否是正在終

止程序的子程序,如果是子程序的父程序會轉為init 程序也稱為

init 領養的程序。

子程序結束後,父程序在做相應檢查時如何得到子程序的終止狀態?

核心為每個終止程序的子程序儲存一定量的資訊,所以當終止程序的

父程序呼叫wait 或waitpid 時,可以得到資訊。

僵死程序概念:

乙個已經終止但是其父程序未對其進行善後處理( 如沒有釋放資源)

的程序。

init

程序領養的程序終止會成為殭屍程序嘛?

不會,因為init 設計成當子程序終止,init 就會呼叫wait 函式取

得其終止狀態,這樣就可以防止在系統中有很多殭屍程序。

wait

和waitpid 函式

當乙個程序終止時,核心就會向其父程序傳送sigchld 訊號。因為子

程序終止是個非同步事件,系統對於該訊號預設採用忽略方式,否則自

己可以定義乙個訊號處理函式。

區別:1: 子程序終止前,wait 使其呼叫者阻塞,而waitpid 有乙個選

擇項,可使呼叫者不阻塞。

2:waitpid 並不等待第乙個終止的子程序,它有若干個選擇項,

可以控制它所等待的程序。

waitpid

的pid 引數解釋與其值有關:

pid == -1 等待任一子程序。於是在這一功能方面waitpid 與wait

等效。pid > 0 等待其程序i d 與p i d 相等的子程序。

pid == 0 等待其組i d 等於呼叫程序的組i d 的任一子程序。

pid < -1 等待其組i d 等於p i d 的絕對值的任一子程序。

waitpid

函式提供了wait 函式沒有提供的三個功能:

(1) waitpid 等待乙個特定的程序( 而w a i t 則返回任一終止子進

程的狀態) 。在討論p o p e n 函式時會再說明這一功能。

(2) waitpid 提供了乙個w a i t 的非阻塞版本。有時希望取得乙個

子程序的狀態,但不想阻塞。

(3) waitpid 支援作業控制(以w u n t r a c e d 選擇項)。

競態條件概念:

當多個程序都企圖對共享資料進行某種處理,而最後的結果又取決於

程序執行的順序時,則我們認為這發生了競態條件

unix環境高階程式設計

檔案描述符file descriptor通常是乙個小的非負整數,核心用以標識乙個特定程序正在訪問的檔案。當核心開啟乙個現有檔案或建立乙個新檔案時,它都返回乙個檔案描述符。在讀寫檔案時,可以私用這個檔案描述符。按管理,每當執行乙個新程式時,所有的shell都為其開啟了3個標準檔案描述符 標準輸入,標準...

UNIX環境高階程式設計

本書是被譽為unix程式設計 聖經 的advanced programming in the unix environment一書的更新版。在本書第1版出版後的十幾年中,unix行業已經有了巨大的變化,特別是影響unix程式設計介面的有關標準變化很大。本書在保持了前一版風格的基礎上,根據最新的標準對...

Unix 環境高階程式設計

本書描述了unix系統的程式設計介面 系統呼叫介面和標準c庫提供的很多函式。與大多數作業系統一樣,unix為程式設計師執行提供了大量的服務 開啟檔案,讀檔案,啟動乙個新程式,分配儲存區以及獲得當前時間等。這些服務被稱為系統呼叫介面 system call inte ce 另外,標準c庫提供了大量廣泛...