Linux系統程式設計(標準I O緩衝區)

2021-09-09 02:40:13 字數 2843 閱讀 8627

標準i/o庫提供緩衝的目的是盡可能地減少使用read和write呼叫的次數。它也對每個i/o流自動地進行緩衝管理,從而避免了應用程式需要考慮這一點所帶來的麻煩。不幸的是,標準i/o庫最令人迷惑的也是它的緩衝。

標準i/o提供了三種型別的緩衝:

1、全緩衝:

當在輸入和輸出中遇到換行符時,標準i/o庫執行i/o操作。這允許我們一次輸出乙個字元,但只有在寫了一行之後才進行實際i/o操作。標準輸入和標準輸出對應終端裝置(如螢幕)時通常是行緩衝的。

3、不帶緩衝:

使用者程式每次調庫函式做寫操作都要通過系統呼叫寫回核心(如系統呼叫函式)。標準錯誤輸出通常是無緩衝的,這樣使用者程式產生的錯誤資訊可以盡快輸出到裝置。

全緩衝:

int

main

(int argc,

char

*ar**)

char

*str =

"hello,world\n"

;fwrite

(str,1,

strlen

(str)

, fp)

;// 往檔案寫內容

while(1

);// 程式阻塞在這裡

return0;

}

執行程式發現,sunplusedu.txt並沒有內容。因為常規檔案通常是全緩衝的,只有緩衝區滿了後,才會把內容寫到檔案中。接下來,我們改一下上面那個例子。

#include

#include

intmain

(int argc,

char

*ar**)

char

*str =

"hello,world\n"

;int i =0;

while

(i <=

512)

while(1

);// 程式阻塞在這裡

return0;

}

上面的例子是迴圈給檔案寫內容,讓緩衝區有填滿的可能,結果發現,檔案是有內容的。實際上要想成功給檔案寫進內容,除了緩衝區填滿,還有別的方法。

1)人為關閉檔案,就算緩衝區沒有填滿,內容也會寫進檔案

#include

#include

intmain

(int argc,

char

*ar**)

char

*str =

"hello,world\n"

;fwrite

(str,1,

strlen

(str)

, fp)

;// 往檔案寫內容

fclose

(fp)

;// 人為關閉檔案,就算緩衝區沒有填滿,內容也會寫進檔案

while(1

);// 程式阻塞在這裡

return0;

}

2)程式正常結束,就算緩衝區沒有填滿,沒有關閉檔案,內容也會寫進檔案。

#include

#include

intmain

(int argc,

char

*ar**)

char

*str =

"hello,world\n"

;fwrite

(str,1,

strlen

(str)

, fp)

;// 往檔案寫內容

return0;

// 程式正常結束,就算緩衝區沒有填滿,沒有關閉檔案,內容也會寫進檔案。

}

行緩衝:

#include

intmain

(int argc,

char

*ar**)

執行這個程式,會發現 hello world 並沒有列印到螢幕上(這個現象在linux用vim可以看到,在windows下vs2012做了優化)。因為標準輸入和標準輸出對應終端裝置時通常是行緩衝的,當在輸入和輸出中遇到換行符時,標準i/o庫執行i/o操作。如下:

#include

intmain

(int argc,

char

*ar**)

除了遇到換行符,還有別的方法可以執行i/o操作。

1)緩衝區填滿

int

main

(int argc,

char

*ar**)

return0;

}

2)人為重新整理緩衝區

#include

intmain

(int argc,

char

*ar**)

3)程式正常結束

#include

intmain

(int argc,

char

*ar**)

不帶緩衝:

#include

#include

intmain

(int argc,

char

*ar**)

(學習複習資料)本文內容來自:

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

e 核心緩衝 緩衝區快取記憶體 read 和write 系統呼叫在操作磁碟檔案時不會直接發起磁碟訪問,而僅僅在使用者空間緩衝區和核心緩衝區快取記憶體之間複製資料。例如 write fd,abc 3 write會立即返回。在後續某個時刻,核心會將其緩衝區中的資料寫入磁碟。在此期間,另一程序試圖讀取該檔...

linux 系統程式設計 標準IO 快取

1 什麼是標準io?與檔案io的區別?檔案io 是直接呼叫核心提供的系統呼叫函式,標頭檔案是unistd.h 標準io 是通過c庫函式間接呼叫系統呼叫函式,標頭檔案是 stdio.h 之前學過 輸入輸入相關的函式,都是和標準的輸入 鍵盤 標註的輸出 顯示器 相關 getchar 從鍵盤得到乙個字元,...

linux系統程式設計(三) 使用緩衝提高I O效率

使用者程序執行在使用者控制項,而磁碟只能被核心直接訪問。當執行系統呼叫時,需要在核心中執行 系統呼叫的開銷不僅僅是因為資料的傳輸。當執行核心 時,cpu需要切換到超級使用者模式,需要建立額外的堆疊和記憶體環境,執行完系統呼叫時,cpu要切換回使用者模式,把堆疊和記憶體環境還原為原來的使用者模式執行狀...