天天看點

##CSAPP讀書日記-第十章-系統級I/O

什麼是系統級I/O?

輸入/輸出(I/O)是在主存和外部裝置之間複制資料的過程。

Unix I/O中的關鍵抽象

所有的I/O裝置都被模型化為檔案,而所有的輸入和輸出都被當作對相應檔案的讀和寫來執行.

這種将裝置優雅地映射為檔案的方式,允許Linux核心引出一個簡單、低級的應用接口,成為Unix I/O,這使得所有的輸入和輸出都能以一種統一且一緻的方式來執行:

  1. 打開檔案。

    核心記錄有關這個打開檔案的所有資訊。應用程式隻需要記住這個描述符。

  2. Linux shell建立的每個程序開始時都有三個打開的檔案:

    标準輸入(0)

    标準輸出(1)

    标準錯誤(2)

  3. 改變目前的檔案位置。

    這個檔案位置是從檔案開頭起始的位元組偏移量。

  4. 讀寫檔案。

    當檔案位置 >= 檔案大小的時候,會觸發EOF(=End Of File)的條件,應用程式能檢測這個條件。

    在檔案結尾處并沒有明确的EOF符号。

  5. 關閉檔案。

    無論一個程序因為何種原因終止時,核心都會關閉所有這個程序打開的檔案并釋放它們的記憶體資源。

##CSAPP讀書日記-第十章-系統級I/O

stat以檔案名作為輸入,fstat以檔案描述符作為輸入。

以下說明了有哪些中繼資料:

##CSAPP讀書日記-第十章-系統級I/O

補充:

什麼是檔案描述符?

每當你打開一個檔案就會獲得該檔案的檔案描述符fd(file discriptor),這個檔案描述符就是一個整數。每個程序在PCB(Process Control Block)中儲存着一份檔案描述符表,檔案描述符就是這個表的索引,每個表項都有一個指向已打開檔案的指針。 如下圖所示:

##CSAPP讀書日記-第十章-系統級I/O

圖中,檔案描述符即為檔案描述符數組的下标。

檔案描述符的配置設定規律:從目前未使用的最小的整數處開始配置設定 。比如說如果你打開一個檔案系統會自動為它打開三個檔案,分别是stdin,stdout,stderr,就是标準輸入,标準輸出,标準輸出。他們的檔案描述符分别是 0,1,2,也就是說當你的檔案打開時它的檔案描述符就從3開始配置設定了,如果你把那三個檔案關閉一個,例如,關掉标準輸入,則打開的檔案的檔案描述符将會填上0,讓後再往後配置設定。

标準 I/O:

C語言定義了一組進階輸入輸出函數,成為标準I/O庫,為程式員提供了Unix I/O的較進階别的替代。

标準I/O庫将一個打開的檔案模型化為一個流。

類型是FILE的流是對檔案描述符和流緩沖區的抽象。

各種I/O包的總結:

##CSAPP讀書日記-第十章-系統級I/O

使用指導:

##CSAPP讀書日記-第十章-系統級I/O
##CSAPP讀書日記-第十章-系統級I/O
##CSAPP讀書日記-第十章-系統級I/O