參考:http://blog.csdn.net/sole_cc/article/details/47983225
緩沖區分為以下三種:
1,流,標准庫的IO緩沖區
文件流操作函數(File *p)直接交互的都是C 標准庫IO buffer,除open(), openat(), read(), write()等文件描述符相關的函數外,其他IO庫函數進行IO操作的直接操作對象都是IO buffer。而且read,write等函數並不是直接從用戶程序直接讀寫數據到磁盤而是與內核IO緩沖區交互。
C標准庫的I/O緩沖區有三種類型:全緩沖、行緩沖和無緩沖。當用戶程序調用庫函數做寫操作(讀操作時I/O緩沖區是如何變化的?)時, 不同類型的緩沖區具有不同特性。
全緩沖:如果緩沖區寫滿了就寫回內核。對於駐留在磁盤上的文件通常是由標准I/O庫實施全緩沖的。在一個流上執行第一次I/O操作時,相關標准I/O函數通常調用malloc獲得需使用的緩沖區。
行緩沖:如果用戶程序寫的數據中有換行符就把這一行寫回內核,或者如果緩沖區寫滿了就寫回內核。標准輸入和標准輸出對應終端設備時通常是行緩沖的。
無緩沖:用戶程序每次調庫函數做寫操作都要通過系統調用寫回內核。標准錯誤輸出通常是無緩沖的,這樣用戶程序產生的錯誤信息可以盡快輸出到設備。
緩沖區類型與調用的函數接口無關,於調用時指定的參數預計默認值有關;標准I/O緩存區是針對每個流的(FILE *fp),而不是針對I/O函數的
下面的是引至APUE的,實際上ISO C要求:
1.當且僅當標准輸入和標准輸出並不涉及交互式設備時,他們才是全緩沖的
2.標准錯誤輸出決不是全緩沖的.
2,內核IO緩沖區
大部分接口函數都是從用戶層到庫IO buffer層(fread(), fwrite()),或是到系統IO緩沖區層(read(), write(), fflush()),那在什么情況下,系統IO緩沖區的數據會同步的磁盤呢,系統在以下兩種情況作出處理:
a) 當內存的臟數據的數量到達一定的閾值時,系統同步到磁盤,釋放緩沖區;
b) 當某項數據停留在緩沖區的時間超過某個時間閾值時。系統也會同步到磁盤;
用戶可通過以下函數接口來處理:
fsync():阻塞至IO同步完成后才返回;
fdatasync():阻塞至IO同步后才會回,只改變data block;
3,用戶緩沖區
應用程序級別的數據空間,局部或者全局變量等;