Linux 之緩衝區

2021-08-24 20:59:49 字數 1923 閱讀 5150

標準i/o為我們提供了3種型別的緩衝區:全緩衝區、行緩衝區、無緩衝區。

(1)全緩衝區

這種緩衝區預設大小為bufsiz,具體大小與系統定義有關。在緩衝區滿或主動呼叫緩衝區重新整理函式fflush()函式後,才進行真正的i/o操作,普通磁碟檔案的寫操作通常使用全緩衝區訪問。

// from /usr/include/stdio.h

#ifndef bufsiz

#define bufsiz _io_bufsiz // bufsiz全域性巨集定義

#endif

// from /usr/include/libio.h

#define _io_bufsiz _g_bufsiz

// from /usr/include/_g_config.h

#define _g_bufsiz 8192 //真實大小,不同系統有差異

(2)行緩衝區:當在遇到換行符或者緩衝區滿時,行緩衝區才重新整理,緩衝區的大小根據系統有所差異,部分系統預設大小為128位元組,終端就是典型的行緩衝區。

(3)無緩衝區:

標準i/o庫不對字元進行快取。如果用標準i/o函式寫若干字元到不帶緩衝區的流中,則相當於用write()系統呼叫函式將這些字元寫至相關聯的檔案中。標準出錯流stderr通常是不帶緩衝區的,這樣的設計是為了使得出錯資訊能夠盡快地顯示出來。

對於標準輸入輸出裝置,ansic要求具有以下緩衝區特徵:

標準輸入和標準輸出裝置:當且僅當不涉及到裝置互動作用時,標準輸入流和標準輸出流才是全緩衝區的。

標準出錯輸出裝置:標準出錯絕不會是全緩衝區的。

另外,如果使用者期望自己定製緩衝區的屬性,可以通過呼叫setbuf(),setvbuf()函式實現,函式執行成功返回零,否則返回非零值,函式宣告如下:

// from /usr/include/stdio.h

void setbuf(file* stream,char* buf)

此函式第1個引數為要操作的流物件,第2個引數buf必須指向乙個長度為bufsiz的緩衝區。如果把buf設定為null,

則表示關閉緩衝區。

// from /usr/include/stdio.h

void setvbuf(file* stream,char* buf,int mode,size_t size)

此函式第1個引數為要操作的流物件,第2個引數buf必須指向乙個長度為size的緩衝區。第三個引數為緩衝區型別,

分別定義如下:

#define _iofbf     0      //全緩衝

#define _iolbf 1 //行緩衝

#define _ionbf 2 //無緩衝

如果指定乙個不帶緩衝區的流,則忽略buf和size引數。如果要指定行緩衝區或全緩衝區,則buf和size需指定

乙個緩衝區且其長度size必須大於等於128位元組。

最後,緩衝區型別可通過流檔案描述符結構體file中的_flags & _io_line_buf(行緩衝區)、 __io_unbuffered(無緩衝區)進行判斷,緩衝區長度也可以通過 _io_buf_end - _io_buf_base 計算得到。

Java NIO 之緩衝區

1 緩衝區 buffer 在nio中負責資料的訪問。緩衝區就是陣列,用於儲存不同資料型別的資料,根據資料型別不同 boolean除外 提供了相應型別的緩衝區 bytebuffer,charbuffer,shortbuffer,intbuffer,longbuffer,floatbuffer,doub...

linux檔案緩衝區

一 緩衝區機制 根據應用程式對檔案的訪問方式,即是否存在緩衝區,對檔案的訪問可以分為帶緩衝區的操作和非緩衝區的檔案操作 緩衝區檔案操作 高階檔案系統,將在使用者空間中自動為正在使用的檔案開闢記憶體緩衝區。非緩衝區檔案系統 低階檔案系統,如果需要,只能由使用者在自己的程式中為每個檔案設定緩衝區。如果採...

linux緩衝區解析

緩衝區是記憶體的一部分空間,用緩衝輸入輸出的資料。緩衝區又分為輸入緩衝區和輸出緩衝區。緩衝區又被稱為快取.主要的意義就是為了提高cpu的效率。輸入端。假如沒有緩衝區,我們要從磁碟中讀取資料,有幾個字元,cpu就要讀寫幾次,cpu是高速率的,而讀取是低速率的,這樣做會降低cpu的效率。相反如果將資料都...