linux下readwritefreadfwrite

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)),確保資料存入磁碟。