標準i/o庫提供緩衝的目的是盡可能地減少使用read和write呼叫的次數。它也對每個i/o流自動地進行緩衝管理,從而避免了應用程式需要考慮這一點所帶來的麻煩。不幸的是,標準i/o庫最令人迷惑的也是它的緩衝。
標準i/o提供了三種型別的緩衝:
1、全緩衝:全緩衝:當在輸入和輸出中遇到換行符時,標準i/o庫執行i/o操作。這允許我們一次輸出乙個字元,但只有在寫了一行之後才進行實際i/o操作。標準輸入和標準輸出對應終端裝置(如螢幕)時通常是行緩衝的。
3、不帶緩衝:
使用者程式每次調庫函式做寫操作都要通過系統呼叫寫回核心(如系統呼叫函式)。標準錯誤輸出通常是無緩衝的,這樣使用者程式產生的錯誤資訊可以盡快輸出到裝置。
執行程式發現,sunplusedu.txt並沒有內容。因為常規檔案通常是全緩衝的,只有緩衝區滿了後,才會把內容寫到檔案中。接下來,我們改一下上面那個例子。int
main
(int argc,
char
*ar**)
char
*str =
"hello,world\n"
;fwrite
(str,1,
strlen
(str)
, fp)
;// 往檔案寫內容
while(1
);// 程式阻塞在這裡
return0;
}
上面的例子是迴圈給檔案寫內容,讓緩衝區有填滿的可能,結果發現,檔案是有內容的。實際上要想成功給檔案寫進內容,除了緩衝區填滿,還有別的方法。#include
#include
intmain
(int argc,
char
*ar**)
char
*str =
"hello,world\n"
;int i =0;
while
(i <=
512)
while(1
);// 程式阻塞在這裡
return0;
}
1)人為關閉檔案,就算緩衝區沒有填滿,內容也會寫進檔案
2)程式正常結束,就算緩衝區沒有填滿,沒有關閉檔案,內容也會寫進檔案。#include
#include
intmain
(int argc,
char
*ar**)
char
*str =
"hello,world\n"
;fwrite
(str,1,
strlen
(str)
, fp)
;// 往檔案寫內容
fclose
(fp)
;// 人為關閉檔案,就算緩衝區沒有填滿,內容也會寫進檔案
while(1
);// 程式阻塞在這裡
return0;
}
行緩衝:#include
#include
intmain
(int argc,
char
*ar**)
char
*str =
"hello,world\n"
;fwrite
(str,1,
strlen
(str)
, fp)
;// 往檔案寫內容
return0;
// 程式正常結束,就算緩衝區沒有填滿,沒有關閉檔案,內容也會寫進檔案。
}
執行這個程式,會發現 hello world 並沒有列印到螢幕上(這個現象在linux用vim可以看到,在windows下vs2012做了優化)。因為標準輸入和標準輸出對應終端裝置時通常是行緩衝的,當在輸入和輸出中遇到換行符時,標準i/o庫執行i/o操作。如下:#include
intmain
(int argc,
char
*ar**)
除了遇到換行符,還有別的方法可以執行i/o操作。#include
intmain
(int argc,
char
*ar**)
1)緩衝區填滿
2)人為重新整理緩衝區int
main
(int argc,
char
*ar**)
return0;
}
3)程式正常結束#include
intmain
(int argc,
char
*ar**)
不帶緩衝:#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要切換回使用者模式,把堆疊和記憶體環境還原為原來的使用者模式執行狀...