Linux系統程式設計 檔案IO緩衝

2021-10-08 09:50:04 字數 1983 閱讀 2344

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 新開啟檔案返回...