繁体   English   中英

setvbuf()-buf为NULL时的size参数

[英]setvbuf() - size parameter when buf is NULL

看来,当我运行以下代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv)
{
    int i=0;

    setvbuf(stdout, NULL, _IOLBF,0);

    while (1)
            printf("%d ",i++);

    return 0;
}

无论我为setvbuf()定义的大小 ,它都会以1024个字符的块打印。 问题是在这种情况下大小是否会受到某种影响,1024个字符的定义从何而来。

我不知道您是如何识别1024但可能是BUFSIZ BUFSIZstdio.h定义。

如果buf为NULL,则stdio库自动分配一个缓冲区以供流使用(除非我们选择未缓冲的I / O)。

编辑

这是glibc所说的:

宏:int BUFSIZ该宏的值是一个整数常量表达式,可用于setvbuf的size参数。 该值保证至少为256

在每个系统上选择BUFSIZ的值,以使流I / O高效。 因此,在调用setvbuf时,最好使用BUFSIZ作为缓冲区的大小。

编辑2

@larsmans是正确的。 我研究了setvbuf的实现方式,当请求行缓冲并显示NULL buf时,它将忽略调用。 现在, stdout不是普通文件,它已附加到终端。 因此,前往pixelbeat

  • 缓冲区大小仅直接影响缓冲模式
  • 像内核这样的默认大小基于页面大小(我的系统上为4096字节)
  • 如果stdin / stdout连接到终端,则默认大小= 1024;
    其他大小= 4096

根据(草稿)C标准,

如果buf不是空指针,则可以使用它指向的数组代替setvbuf函数分配的缓冲区,并且参数size指定数组的大小; 否则, size 确定由分配的缓冲区的大小setvbuf功能。 [重点已添加。]

因此,假设您正确地进行了测量,那么当buf为null时,Glibc似乎可以自由地随意执行操作,并且为您提供了1kB的缓冲区。 由于您从不编写换行符,因此行缓冲无效,其行为类似于完全缓冲。

对于NULL buf指针,大小可能影响不大。

与然而,你还在请求缓冲输出_IOLBF尝试_IONBF代替。

http://en.wikipedia.org/wiki/Setvbuf

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM