繁体   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