e## 核心緩衝:緩衝區快取記憶體
read()和write()系統呼叫在操作磁碟檔案時不會直接發起磁碟訪問,而僅僅在使用者空間緩衝區和核心緩衝區快取記憶體之間複製資料。例如
write
(fd,
"abc",3
);
write會立即返回。在後續某個時刻,核心會將其緩衝區中的資料寫入磁碟。在此期間,另一程序試圖讀取該檔案的這幾個位元組,那麼核心將會自動從緩衝區快取記憶體中提供。
設定乙個stdio流的緩衝模式
#include
intsetvbuf
(file* stream,
char
* buf,
int mode, size_t size)
;
開啟流之後,必須在呼叫其他stdio函式之前先呼叫setvbuf。
引數buf和size針對要使用的緩衝區
如果buf不為null,則指向以size大小的記憶體塊。(應使用堆中記憶體)
如果buf為null,stdio會自動分配緩衝區
mode:
_ionbf:
不對i/o進行緩衝。即 立即呼叫write,read
_iolbf:
採用行緩衝。對於輸出流,在輸出乙個換行符(除非緩衝區滿)前將緩衝資料。對於輸入流,每次讀一行。
_iofbf:
全緩衝。單次讀寫資料的大小與緩衝區相同。
#include
void
setbuf
(file* stream,
char
* buf)
;
該函式等於:
setvbuf
(fp, buf,
(buf !=
null
)? _iofbf: _inobf, bufsize)
;
重新整理stdio緩衝區
int
fflush
(file* stream)
;
若引數為null,則重新整理所有的緩衝區。
同步io完成:某一io操作,要麼已成功完成到磁碟的資料傳遞,要麼被診斷為不成功。
同步io資料完整性:確保針對檔案的一次更新傳遞了足夠的資訊到磁碟,以便於之後對資料的獲取。
同步io檔案完整性:在對檔案更新過程中,要將所有發生更新的檔案元資料都傳遞到磁碟上。
#include
intfsync
(int fd)
;
fsync會強制檔案處於同步io檔案完整性。
#include
intfdatasync
(int fd)
;
例:若修改了檔案資料,但是檔案大小不變,那麼呼叫fdatasync()只強制進行了資料更新。而fsync會將元資料頁傳遞到磁碟上。
使所有寫入同步:o_sync
呼叫open函式時加上o_sync,會使後續所有輸出同步
int fd =
open
(name, o_wronly|o_sync)
;
呼叫open後write會按同步io檔案完整的要求執行。
#include
intfileno
(file* stream)
;file*
fdopen
(int fd,
const
char
* mode)
;
io系統呼叫會直接將資料傳遞到核心緩衝區快取記憶體,而stdio庫函式會等到使用者空間流緩衝區滿,在呼叫write。
《linux/unix 系統程式設計手冊》
Linux系統程式設計(標準I O緩衝區)
標準i o庫提供緩衝的目的是盡可能地減少使用read和write呼叫的次數。它也對每個i o流自動地進行緩衝管理,從而避免了應用程式需要考慮這一點所帶來的麻煩。不幸的是,標準i o庫最令人迷惑的也是它的緩衝。標準i o提供了三種型別的緩衝 1 全緩衝 當在輸入和輸出中遇到換行符時,標準i o庫執行i...
Linux系統程式設計 檔案IO 一
最近在在實驗樓上學linux,做點筆記。上面的課程對於學習linux還不錯,有興趣可以看看。檔案io linux提供給了使用者程式一些介面,用來呼叫執行相關的功能。大多數linux檔案i o只需要用到5個函式 open,read,write,lseek和close 檔案描述符 檔案描述符是乙個非負整...
linux系統程式設計之檔案I O
一 檔案描述符 linux系統中,所有開啟的檔案都對應乙個數字,這個數字由系統來分配,稱為檔案描述符。pcb程序控制塊裡有檔案描述符表,以陣列形式存放於核心區。乙個程序預設開啟3個檔案描述符 stdin fileno 0 stdout fileno 1 stderr fileno 2 新開啟檔案返回...