[英]setvbuf not changing buffer size?
我有以下玩具代碼來測試fread
上的 I/O 緩沖,我得到了我沒想到的結果:
#include <stdio.h>
#include <stdio_ext.h>
int main()
{
FILE *fp;
char buff[255];
fp = fopen("/home/install.sh", "r");
int result = setvbuf(fp, NULL, _IOFBF, 700); // set buffering size to some arbitrary value, say 700
printf("Result of setting buffer: %d\n", result ); // "Result of setting buffer: 0"
printf("Buffer size: %zd\n", __fbufsize(fp) ); // "Buffer size: 4096"
fread(buff, 255, 1, fp);
printf("%s\n", buff ); // prints 255 bytes as I would expect
}
從上面看,似乎setvbuf
調用成功,因為它返回0
,但是緩沖區大小保持在4096
。 此外,我嘗試打印出BUFSIZ
並顯示8192
。 運行strace
確實顯示底層read
調用為4096
字節。 關閉緩沖似乎工作正常,因為緩沖區大小設置為 1。
此外,我不明白為什么BUFSIZ
( 8192
)與這些讀取的默認值( 4096
)不同。
我嘗試了許多不同的緩沖區大小值,但無濟於事。
我正在運行ldd (Ubuntu GLIBC 2.27-3ubuntu1) 2.27
我在這里閱讀了以下https://en.cppreference.com/w/c/io/setvbuf :
並非所有 size 字節都必須用於緩沖:實際緩沖區大小通常向下舍入為 2 的倍數、頁面大小的倍數等。
在許多實現中,行緩沖僅可用於終端輸入流。
因此,它可能不適用於您系統上的文件句柄。
如果它確實有效,我可以想象小於文件系統上分配單元大小的值沒有多大意義(很可能是 8192)。
setvbuf 不改變緩沖區大小?
當mode == _IOFBF
_IOFBF 和buff == NULL
時, Glibc setvbuf 實現只是忽略size
參數。 這很好 - 緩沖模式的特征是實現定義的。 而__fbufsize
是一個非標准的擴展。 通常,您不應依賴底層FILE
的緩沖。
我不明白為什么BUFSIZ(8192)與這些讀取的默認值(4096)不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.