緩衝區是記憶體的一部分空間,用緩衝輸入輸出的資料。緩衝區又分為輸入緩衝區和輸出緩衝區。緩衝區又被稱為快取.
主要的意義就是為了提高cpu的效率。
輸入端。假如沒有緩衝區,我們要從磁碟中讀取資料,有幾個字元,cpu就要讀寫幾次,cpu是高速率的,而讀取是低速率的,這樣做會降低cpu的效率。相反如果將資料都存在緩衝區裡面,等要讀取的時候就可以一次性讀取多數的資料。大大地提高了cpu的效率。
輸出端。假如要將資料列印出來,印表機是低速的,cpu是高速的。將資料放入緩衝區,避免資料被分為多次列印,就此解放了cpu,使它能去處理其他任務。
(1)行緩衝
遇到\n就重新整理緩衝區,當在輸入和輸出中遇到換行符時,執行真正的i/o操作。這時,我們輸入的字元先存放在緩衝區,等按下回車鍵換行時才進行實際的i/o操作。典型代表是鍵盤輸入資料和輸出資訊到螢幕(標準輸入輸出例如printf())。
(2)全緩衝
當緩衝區寫滿以後就會重新整理緩衝區。當填滿標準i/o快取後才進行實際i/o操作。全緩衝的典型代表是對磁碟檔案的讀寫(例如fwrite())。
(3)無緩衝
既沒有緩衝區,代表是系統呼叫(例如write());
(1)行緩衝在遇到\n和緩衝區滿的時候重新整理
(2)全緩衝在緩衝區寫滿的時候會重新整理
(3)程序退出的時候兩種緩衝都會由作業系統強制重新整理
(4)fflush()函式可重新整理緩衝區
首先介紹一下幾個概念
(1)系統呼叫:作業系統直接暴露給使用者的介面。
(2)庫函式:把系統呼叫進行二次封裝之後給使用者使用的結果叫做庫函式(封裝系統呼叫,實現相同的複雜邏輯,節省工作量)
(3)因此庫函式和系統呼叫具有層級關係,庫函式是系統呼叫的上層(以f開頭的函式如fwrite都是庫函式,去掉f如write是系統呼叫)
(4)系統呼叫不具有緩衝區,庫函式具有緩衝區,而庫函式是系統呼叫的上層,因此,緩衝區是c語言庫提供的。具體一點是由庫中的檔案操作符提貢的
char *buf="hello bit\n";
printf("hello\n");
write(1,buf,strlen(buf));
pid_t id=fork();
if(id==0)
else
(1)輸出結果
(2)然後將輸出重定向到檔案中去
比較一下差異,為什麼輸出到檔案中去以後hello就被輸出了兩回呢?
解析:因為在fork之前調⽤用write,所以其資料只寫到標準輸
出⼀一次,所以其資料只寫到標準輸出一次。標準i/o是緩衝的,如果標準輸出到終端裝置,則它是行緩衝,否則它是全
緩衝。當以互動方式執行該程式時,只得到printf輸出的行一次,因為標準輸出到終端緩衝區由換行符沖洗。但將標準輸出重定向到乙個檔案時,由於緩衝區是全緩衝,遇到換行符不輸出,當呼叫fork時,其printf的資料仍然在緩衝區中,該資料將被複製到子程序中,該緩衝區也被複製到子程序中。於是⽗父子程序的都有了帶改行內容的標準i/o緩衝區,所以每個程序終⽌止時,會沖洗其緩衝區中的資料,得到第⼀乙個printf輸出兩次。
linux檔案緩衝區
一 緩衝區機制 根據應用程式對檔案的訪問方式,即是否存在緩衝區,對檔案的訪問可以分為帶緩衝區的操作和非緩衝區的檔案操作 緩衝區檔案操作 高階檔案系統,將在使用者空間中自動為正在使用的檔案開闢記憶體緩衝區。非緩衝區檔案系統 低階檔案系統,如果需要,只能由使用者在自己的程式中為每個檔案設定緩衝區。如果採...
Linux 之緩衝區
標準i o為我們提供了3種型別的緩衝區 全緩衝區 行緩衝區 無緩衝區。1 全緩衝區 這種緩衝區預設大小為bufsiz,具體大小與系統定義有關。在緩衝區滿或主動呼叫緩衝區重新整理函式fflush 函式後,才進行真正的i o操作,普通磁碟檔案的寫操作通常使用全緩衝區訪問。from usr include...
輸入緩衝區與輸出緩衝區
本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...