標準I O庫的緩衝機制

2021-06-21 11:32:47 字數 2364 閱讀 1238

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

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

(1)全緩衝。這種情況下,在填滿標準i/o緩衝區後才進行實際的i/o操作。對於駐留在磁碟上的檔案通常是由標準i/o庫實施全緩衝的。在乙個流上執行第一次i/o操作時,相關標準i/o函式通常呼叫malloc獲得需使用的緩衝區。

術語沖洗(flush)說明標準i/o緩衝區的寫操作。緩衝區可由標準i/o例程自動沖洗(例如當填滿乙個緩衝區時),或者可以呼叫函式fflush沖洗乙個流。值得引起注意的是在unix環境中,flush有兩種意思:在標準i/o庫方面,flush(沖洗)意味著將緩衝區中的內容寫到磁碟上(該緩衝區可能只是區域性填寫的)。在終端驅動程式方面,flush(刷清)表示丟棄已儲存在緩衝區中的資料。

(2)行緩衝。在這種情況下,當在輸入和輸出中遇到換行符時,標準i/o庫執行i/o操作。這允許我們一次輸出乙個字元(用標準i/o fputc函式,該函式一次只輸出乙個字元,沒有換行符),但只有在寫了一行之後才進行實際i/o操作。當流涉及乙個終端時(例如標準輸入和標準輸出),通常使用行緩衝。

對於行緩衝有兩個限制。第一,因為標準i/o庫用來收集每一行的緩衝區的長度是固定的,所以只要填滿了緩衝區,那麼即使還沒有寫乙個換行符,也進行i/o操作。第二,任何時候只要通過標準i/o庫要求從(a)乙個不帶緩衝的流,或者(b)乙個行緩衝的流(它要求從核心得到資料)得到輸入資料,那麼就會造成沖洗所有行緩衝輸出流。在(b)中帶了乙個括號中的說明,其理由是,所需的資料可能已在該緩衝區中,它並不要求在需要資料時才從核心讀資料。很明顯,從不帶緩衝的乙個流中進行輸入((a)項)要求當時從核心得到資料。

(3)不帶緩衝。標準i/o庫不對字元進行緩衝儲存。例如,如果用標準i/o函式fputs寫15個字元到不帶緩衝的流中,則該函式很可能用write系統呼叫函式將這些字元立即寫到相關聯的開啟檔案上。

標準出錯流stderr通常是不帶緩衝的,這就使得出錯資訊可以盡快顯示出來,而不管它們是否含有乙個換行符。

iso c要求下列緩衝特徵:

但是,這並沒有告訴我們如果標準輸入和輸出涉及互動式裝置時,它們是不帶緩衝的還是行緩衝的;以及標準出錯是不帶緩衝的還是行緩衝的。很多系統預設使用下列型別的緩衝:

對任何乙個給定的流,如果我們並不喜歡這些系統預設的情況,則可呼叫下列兩個函式中的乙個更改緩衝型別:

#include void setbuf( file *restrict fp, char *restrict buf );

int setvbuf( file *restrict fp, char *restrict buf, int

mode, size_t size );

返回值:若成功則返回0,若出錯則返回非0值

這些函式一定要在流已被開啟後呼叫,而且也應該在對該流執行任何乙個其他操作之前呼叫。

可以使用setbuf函式開啟或關閉緩衝機制。為了帶緩衝進行i/o,引數buf必須指向乙個長度為bufsize的緩衝區(該常量定義在中)。通常在此之後該流就是全緩衝的,但是如果流與乙個終端相關,那麼某些系統也可將其設定為行緩衝。為了關閉緩衝,將buf設定為null。

使用setvbuf,我們可以精確地指定所需的緩衝型別。這是用mode引數實現的:

_iofbf

全緩衝_iolbf

行緩衝_ionbf

不帶緩衝

如果指定乙個不帶緩衝的流,則忽略buf和size引數。如果指定全緩衝或行緩衝,則buf和size可選擇地指定乙個緩衝區及其長度。如果該流是帶緩衝的,而buf是null,則標準i/o庫將自動地為該流分配適當長度的緩衝區。適當長度指的是由常量bufsize所指定的值。

某些c函式庫實現使用stat結構中的成員st_blksize所指定的值決定最佳i/o緩衝區長度。gnu c函式庫就使用這種方法。

表5-1列出了這兩個函式的動作,以及它們的各個選項。

要了解,如果在乙個函式內分配乙個自動變數類的標準i/o緩衝區,則從該函式返回之前,必須關閉該流。另外,有些實現將緩衝區的一部分用於存放它自己的管理操作資訊,所以可以存放在緩衝區中的實際資料位元組數少於size。一般而言,應由系統選擇緩衝區的長度,並自動分配緩衝區。在這種情況下關閉此流時,標準i/o庫將自動釋放緩衝區。

任何時候,我們都可以強制沖洗乙個流。

#include int fflush( file *fp );

返回值:若成功則返回0,若出錯則返回eof

此函式使該流所有未寫的資料都被傳送至核心。作為乙個特例,如若fp是null,則此函式將導致所有輸出流被沖洗。

標準I O緩衝機制

標準i o庫提供緩衝的目的是盡可能減少使用read和write呼叫的次數。它對每個io流自動的進行緩衝管理,從而避免了應用程式需要考慮這一點所帶來的麻煩。不幸的是,標準io庫最令人迷惑的也是他的緩衝。標準io提供了3種緩衝機制 1 全緩衝。這種情況下,在填滿標準io緩衝區後才進行實際io操作。對於駐...

標準IO庫的緩衝機制引起的問題

在介紹有緩衝機制i o和無緩衝機制i o的區別之前。先看乙個例子預熱一下,如果知道為什麼,就說明關於兩者的區別是很明了的,如果看到結果很吃驚,就說明還有一點偏差 include include int main else if pid 0 i else sleep 2 printf ni dn i ...

5 4 標準I O庫 緩衝

標準i o提供了三種型別的緩衝。標準出錯流stderr通常是不帶緩衝的,這就使得出錯資訊可以盡快顯示出來,而不管它們時候含有乙個換行符。iso c要求下列緩衝特徵 很多系統預設使用下列型別的緩衝 標準出錯是不帶緩衝的,開啟至終端裝置的流是行緩衝的 其他所有流則是全緩衝的。可呼叫下列兩個函式中的乙個更...