read/write/fsync
標準I/O函式,POSIX定義,linux底層操作,屬於核心呼叫,不帶緩衝,
檔案描述符為整數
可以指定要建立檔案的許可權
fread/fwrite/fflush
標準C定義,基於read/write/fsync封裝實現,相比於前者增加了緩衝機制,減少呼叫次數,但是增加了記憶體複製次數
檔案描述符為FILE指標
無法指定要建立檔案的許可權
————————————————————————————————————————————————————————————————-
關於緩衝
如果檔案的大小是8k。
如果用read/write,且只分配了2k的快取,則要將此檔案讀出需要做4次系統呼叫來實際從磁碟上讀出。
如果你用fread/fwrite,則系統自動分配快取,則讀出此檔案只要一次系統呼叫從磁碟上讀出。
也就是用read/write要讀4次磁碟,而用fread/fwrite則只要讀1次磁碟。效率比read/write要高4倍。
如果程式對記憶體有限制,則用read/write比較好。
使用物件
對於fread 和fwrite,它自動分配快取,速度會很快,比自己來做要簡單。如果要處理一些特殊的描述符,用read 和write,如套介面,管道之類的
fflush和fsync
fflush:把C庫中的緩衝呼叫write函式寫入磁碟(其實是核心緩衝區)
fsync:把核心緩衝區刷到磁碟上
所以fflush和fsync的呼叫順序是:
c庫緩衝 -> fflush -> 核心緩衝 -> fsync -> 磁碟
所以對於輸出裝置或磁碟檔案,fflush只能保證資料到達核心緩衝區,並不能保證資料到達物理裝置, 因此應該在呼叫fflush後,呼叫fsync(fileno(stream)),確保資料存入磁碟。