天天看點

解讀《深入了解計算機系統(CSAPP)》第10章系統級IO導讀:

導讀:

一切都是檔案,都可以用 “”打開open –> 讀寫write/read –> 關閉close” 模式來操作。輸入/輸出(I/O) 是指主存和外部裝置(如磁盤,終端,網絡)之間拷貝資料過程。

進階别IO有 C提供标準IO庫 I/O函數 scanf 和 printf ,C++重載操作符<<和>>,Liunx系統使用核心提供的系統級I/O函數實作……大多數時候進階别I/O函數都運作良好,為什麼我們還要學Unix I/O:了解Unix I/O将幫助你了解其他的系統概念。要深入了解其他概念,必須了解I/O。标準I/O庫沒有提供讀取檔案中繼資料的方式(如檔案大小或檔案建立時間)。

重點解讀:

一、Unix I/O

一個Liunx檔案就是一個m個位元組的序列:B0 B1 ……B(m-1),所有I/O裝置都被模型化為檔案。而所有的輸入和輸出都被當做相應檔案的讀和寫。這種将裝置優雅地映射成檔案,允許Unix核心引出一個簡單,低級的應用接口。叫做Unix I/O。

打開檔案:應用程式要求核心打開檔案,核心傳回一個小的非負整數,叫做描述符,它在後續對此檔案的所有操作中辨別這個檔案。核心記錄打開檔案的所有資訊,應用程式隻需要記住描述符。

改變目前檔案位置:對于每個打開的檔案,核心保持一個檔案位置k,初始為0。檔案位置即是從檔案開頭起始的位元組偏移量。應用程式通過執行 seek 操作,顯式地設定檔案位置 k 。

讀寫檔案:一個讀操作就是從檔案拷貝n個位元組到記憶體,然後将k增加到k+n。給定一個大小為m位元組的檔案,當k>=m時執行讀操作會觸發一個稱 為 end-of-file(EOF)的條件。應用程式能檢測到這個條件(或者說信号?),檔案結尾并沒有這樣的符号。寫操作就是從存儲器拷貝n個位元組到一個檔案,從目前檔案位置k開始,然後更新k。 

關閉檔案:當應用程式完成了檔案的通路,通知核心關閉檔案。作為響應核心釋放檔案打開時建立的資料結構。将描述符恢複到可用的描述符池中。無論一個程序因為何種原因被關閉,核心會關閉所有它打開的檔案,并釋放他們的記憶體資源。

解讀《深入了解計算機系統(CSAPP)》第10章系統級IO導讀:

二、打開和關閉檔案

程序是通過調用 open函數來打開一個已存在的檔案或者建立一個新檔案的

三、讀和寫檔案

調用read和write完成輸入輸出

四、讀取檔案中繼資料

應用程式能夠通過調用stat和fstate函數,檢索到關于檔案的資訊(有時也稱為檔案的中繼資料(metadata))

五、讀取目錄内容

應用程式可以用 readdir 系列函數讀取目錄的内容

六、共享檔案

核心有三個相關的資料結構來表示打開的檔案:

描述符表(descriptor table):每個程序都有它獨立的描述符表。它的表項是由程序打開的檔案描述符來索引的。每個打開的描述符表項指向檔案表的一個表項。

檔案表(file table):打開檔案的集合是由一張檔案表表示的。所有的程序共享這張表。每個檔案表項的部分組成,包括目前的檔案位置、引用計數(reference count)即目前指向該表項的描述符項數)、以及一個指向v-node表中對應表項的指針。關閉一個描述符會減少相應檔案表表項中的引用計數。當引用計數變為0。核心會删除這個檔案表表項。

v-node表:所有的程序共享這張表。每個表項包含stat結構的大多數資訊。包括st_mode、st_size。

重定向标準輸出之後的核心資料結構

解讀《深入了解計算機系統(CSAPP)》第10章系統級IO導讀:

七、标準I/O

ANSI C定義了一組進階輸入輸出函數,稱為标準I/O庫。這個庫(libc)提供了,打開和關閉檔案的函數(fopen和fclose)、讀和寫位元組(fread和fwrite)、讀和寫字元串的函數(fgets和fputs)、以及複雜的格式化I/O函數 (scanf和printf)

我們該使用哪些I/O函數

解讀《深入了解計算機系統(CSAPP)》第10章系統級IO導讀:

繼續閱讀