簡體   English   中英

setvbuf 不改變緩沖區大小?

[英]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。

此外,我不明白為什么BUFSIZ8192 )與這些讀取的默認值( 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)不同。

Glibc確實mmap文件。 由於mmap的大小得到四舍五入page size

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM