APUE讀書筆記 第14章 高階I O

2022-09-15 23:09:21 字數 1992 閱讀 4772

14.1 引言

*高階i/o包括非阻塞i/o、記錄鎖、系統v流機制、i/o多路轉換(select和poll函式)、readv和writev函式以及儲存對映i/o(mmap)

14.2 非阻塞i/o

*非阻塞i/o使我們可以呼叫open、read和write這樣的i/o操作,並使這些操作不會永遠阻塞

14.3 記錄鎖

*記錄鎖(record locking)的功能是:當乙個程序正在讀或修改檔案的某個部分時,它可以組織其他程序修改同一檔案區

*考慮資料庫訪問例程庫。如果該庫中所以函式都以一致的方法處理記錄鎖,則稱使用這些函式訪問資料庫的任何程序集為合作程序(cooperating process)。

*建議性鎖並不能阻止對資料庫檔案有寫許可權的任何其他程序對資料庫檔案進行隨意的寫操作

*強制性鎖使核心對每乙個open、read和write系統呼叫都進行檢查,檢查呼叫程序對正在訪問的檔案是否違背了某一把鎖的作用。強制性鎖有時也被稱為強迫方式鎖(enforcement-mode locking)

*如果乙個程序試圖讀、寫乙個強制性鎖起作用的檔案,而欲讀、寫的部分又由其他程序加上了讀或寫鎖,此時會發生什麼呢?對這一問題的回答取決於三方面的因素:操作型別(read或write),其他程序保有的鎖的型別(讀鎖或寫鎖),以及有關描述符是阻塞還是非阻塞的

14.4 streams

*流在使用者程序和裝置驅動程式之間提供了一條全雙工通路。流無需和實際硬體會話,流也可以用來構造偽裝置驅動程式

*任意數量的處理模組可以壓入流。我們使用術語壓入,是因為每一新模組總是插到流首之下,而將以前的模組下壓(這類似於後進先出的棧)

*ioctl的第二個引數request說明執行哪乙個操作。所有request都以i_開始。第三個引數的作用與request有關,有時它是乙個整數值,有時它是指向乙個整型或乙個資料結構的指標

14.5 i/o多路轉接

*問題:telnet程序有兩個輸入、兩個輸出。對這兩個輸入中的任乙個都不能使用阻塞read,因為我們永遠不知道哪乙個輸入有我們需要的資料

*一種方法是仍舊使用乙個程序執行該程式,但使用非阻塞i/o讀取資料。基本方法是將兩個輸入描述符都設定為非阻塞的,對第乙個描述符發乙個read。如果該輸入上有資料,則讀資料並處理它;如果無資料可讀,則read立即返回。然後對第二個描述符作同樣的處理。

*一種比較好的技術是i/o多路轉換(i/o multiplexing)。先構造一張有關描述符的列表,然後呼叫乙個函式,直到這些描述符中的乙個已準備好進行i/o時,該函式才返回。在返回時,它告訴程序哪些描述符已準備好可以進行i/o

14.6 非同步i/o

*除了呼叫ioctl說明產生sigpoll訊號的條件以外,還應為該訊號建立訊號處理程式。對於sigpoll的預設動作是終止該程序,所以應當在呼叫ioctl之前建立訊號處理程式

14.7 readv和writev函式

*readv和writev函式用於在一次函式呼叫中讀、寫多個非連續緩衝區。有時也將這兩個函式稱為散布讀(scatter read)和聚集寫(gather write)

14.8 readn和writen函式

*管道、fifo以及某些裝置,特別是終端、網路和streams裝置有下列兩種性質:

(1)一次read操作所返回的資料可能少於所要求的資料,即使還沒達到檔案尾端也可能是這樣。這不是乙個錯誤,應當繼續改裝置

(2)一次write操作的返回值也可能少於指定的位元組

14.9 儲存對映i/o

*mmap函式實現就告訴核心將乙個檔案對映到乙個儲存區域中

*void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off);

*addr引數用於指定對映儲存區的起始位址

*len是對映位元組數

*prot引數說明對對映儲存區的保護要求。對指定對映儲存區的保護要求不能超過檔案open模式訪問許可權

*flag引數影響對映儲存區的多種屬性

*filedes指定要被對映檔案的描述符

*off是要對映位元組在檔案中的起始偏移量

APUE讀書筆記 第10章 訊號

第10章 訊號 10.1 引言 訊號是軟體中斷。訊號提供了一種處理非同步事件的方法 10.2 訊號概念 每個訊號都有乙個名字。這些名字都以三個字元sig開頭 在標頭檔案中,這些訊號被定義為正整數 訊號編號 不存在編號為0的訊號。kill函式對訊號編號0有特殊的應用。此種訊號編號值被稱為空訊號 10....

APUE讀書筆記 14 程序關係 下

一 會話 會話是乙個或者多個程序組的集合,如下圖中乙個會話有三個程序組 會話中的程序組通常是由shell中的管道 進行連線的,比如上圖的安排可能是有如下命令形成的 p1 p2 p3 p4 p5,程序呼叫setsid函式可以建立乙個新會話。如果呼叫這個函式的程序不是乙個程序組的組長,那麼將會發生以下三...

APUE讀書筆記 第9章 程序關係

第9章 程序關係 9.1 引言 每個程序都有乙個父程序 初始的核心程序並無父程序,也可以說其父程序就是它自己 當子程序終止時,父程序得到通知並能取得子程序的退出狀態 9.2 終端登入 終端可以是基於字元的終端 簡單的基於字元終端的圖形終端,或者是執行視窗系統的圖形終端 系統管理員建立通常名為 etc...