緩衝
標準i/o庫提供緩衝的目的是盡可能減少read和write呼叫的次數。它也對每個i/o流自動地進行緩衝管理,從而避免了應用程式需要考慮這一點所帶來的麻煩。不幸的是,標準i/o庫最令人迷惑的也是它的緩衝。
標準i/o提供了三種型別的緩衝:
(1)、全緩衝。在這種情況下,在填滿標準i/o緩衝區後才進行實際i/o操作。對於駐留在磁碟上的檔案通常是由標準i/o庫實施全緩衝的。
(2)、行緩衝。在這種情況下,當在輸入的和輸出中遇到換行符時,標準i/o庫執行i/o操作。只有在寫了一行之後才進行實際i/o操作。當流涉及乙個終端時(例如標準輸入和標準輸出),通常使用行緩衝。對於行緩衝有兩個限制。第一,因為標準i/o庫用來收集每一行的緩衝區的長度是固定的,所以只要填滿了緩衝區,那麼還沒有寫乙個換行符,出進行i/o聽任。第二,任何時候只要通過標準i/o庫從乙個不帶緩衝的流,或者乙個行緩衝的流得到輸入資料,那麼不會造成沖洗所有行緩衝輸出流。
(3)、不帶緩衝。標準i/o不對字元進行緩衝儲存。標準出錯流stderr通常是不帶緩衝,這就使得出錯資訊可以盡快顯示出來,而不管它們是否含有乙個換行符。
下面是比較重要的特徵:
iso c 要求下列緩衝特徵:
1、當且僅當標準輸入和標準輸出並不涉及互動式裝置時,它們才是全緩衝的。
2、標準出錯決不會是全緩衝的。
3、標準出錯預設是不帶緩衝的。
4、如若是涉及終端裝置的其他流,則它們是行緩衝的;否則是全緩衝的。
-----------------------------分割線--------------------------------------
看了上面的總結可能還是有點迷惑,可以結合兩個例子理解一下行緩衝和全緩衝造成的問題。
第乙個例子是來自《unix網路程式設計 第3版》p144 《6.5批量輸入》這一章節。這一章節闡述了為了提高效能而引入緩衝區機制的問題,說明了行緩衝與全緩衝的區別。看看這裡,可以加深「當且僅當標準輸入和標準輸出並不涉及互動式裝置時,它們才是全緩衝的。」、「對於駐留在磁碟上的檔案通常是由標準i/o庫實施全緩衝的。」的理解。
第二個例子是來自《unix環境高階程式設計 2nd的15.4協同程序p410和p411的程式清單的問題。這一章節也是闡述了標準i/o緩衝機制所引入的問題。因為這個程式的標準輸入是乙個管道,所以系統預設是全緩衝的。(當且僅當標準輸入和標準輸出並不涉及互動式裝置時,它們才是全緩衝的。)。
ps:《unix網路程式設計 第3版》p153」拒絕服務型攻擊」那裡應該印刷錯了,如果程式中呼叫是readline的話,伺服器才會出問題。如果單純是呼叫read是不會出現拒絕服務的情況。
詳細帖子:
標準I O緩衝機制
標準i o庫提供緩衝的目的是盡可能減少使用read和write呼叫的次數。它對每個io流自動的進行緩衝管理,從而避免了應用程式需要考慮這一點所帶來的麻煩。不幸的是,標準io庫最令人迷惑的也是他的緩衝。標準io提供了3種緩衝機制 1 全緩衝。這種情況下,在填滿標準io緩衝區後才進行實際io操作。對於駐...
標準I O庫的緩衝機制
標準i o庫提供緩衝的目的是盡可能減少使用read和write呼叫的次數。它也對每個i o流自動地進行緩衝管理,從而避免了應用程式需要考慮這一點所帶來的麻煩。標準i o提供了三種型別的緩衝 1 全緩衝。這種情況下,在填滿標準i o緩衝區後才進行實際的i o操作。對於駐留在磁碟上的檔案通常是由標準i ...
APUE讀書筆記 第5章 標準I O庫
1.流和file物件 當用標準i o庫開啟或建立乙個檔案時,我們已使乙個流與乙個檔案相關聯。當開啟乙個流時,標準i o函式fopen返回乙個指向file物件的指標。該物件包含了標準i o庫為管理該流需要的所有資訊。2.標準輸入 標準輸出和標準錯誤 這3個標準i o流通過預定義檔案指標stdin st...