1. 在核心中,所有的檔案系統操作都是基於塊來執行的。實際上,塊是i/o中的基本概念。因此,所有i/o操作都是在塊大小或者塊大小的整數倍上執行。也就是說,也許你只想讀取乙個位元組,實際上需要讀取整個塊。額外的系統呼叫所帶來的開銷會導致操作效能急劇下降。例如,要讀取1024個位元組,如果每次讀乙個位元組需要執行1024次呼叫,而如果乙個讀取1024位元組的塊則只需要呼叫一次。對於前一種,提公升效能的途徑是「使用者緩衝i/o」(user-buffered i/o),通過緩衝i/o,從使用者角度,讀寫資料並沒有任何變化,而實際上,只有當資料量大小達到檔案系統塊大小整數倍時,才會執行真正的i/o操作。
2. 實際應用中,塊大小一般是512位元組、1024位元組、2048位元組或4096位元組。核心和硬體之間的互動單元是塊。標準i/o程式集並不是直接操作檔案描述符。相反,他們通過唯一標識發,即檔案指標來操作。在標準i/o中,開啟的檔案成為「流「(stream)。
3. 標準i/o實現了三種型別的使用者緩衝:
無緩衝(unbuffered)
不執行使用者緩衝。資料直接提交給核心,不支援使用者緩衝,通常很少使用,只有乙個例外:標準錯誤預設是採用無緩衝模式。
行緩衝(line-buffered)
緩衝是以行單位執行,每遇到換行符,緩衝區就會被提交到核心。行緩衝是終端的預設緩衝模式,比如標準輸出。
塊緩衝(block-buffered)
緩衝以塊單位執行,每個塊是固定的位元組數。預設情況下,和檔案相關的所有流都是塊緩衝模式。標準i/o稱塊緩衝為」完全緩衝「(full buffering)。
第3章 檔案I O
引言unix系統中的大多數檔案i o 只需要用到5個函式 open read write lseek以及close 檔案描述符 用於描述檔案開啟或者建立之後返回的乙個非負整數,可以理解為檔案的id 特殊用途的標號 0 標準輸入 1 標準輸出 2 標準錯誤 早期系統一般乙個程序最多開啟16個檔案,現在...
第3章 檔案I O
3.2 檔案描述符 對於核心而言,所有開啟的檔案都通過檔案描述符引用。檔案描述符時乙個非負整數。當開啟乙個現有檔案或建立乙個新檔案時,核心向程序返回乙個檔案描述符。當讀 寫乙個檔案時,使用open或creat返回的檔案描述符標識該檔案,將其作為引數傳送給read或write。按照慣例,unix系統s...
第3章 檔案I O
3.3 函式open和openat 呼叫open或openat函式可以開啟或建立乙個檔案。iinclude int open const char path,int oflag,mode t mode int openat int fd,const char path,int oflag,mode ...