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

时间:2011-05-22 15:00:17

标签: c glibc stdio

当我运行以下代码时似乎:

#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;
}

它打印成1024个字符的块,无论我为setvbuf()定义的 size 。 问题是,如果 size 在这种情况下以某种方式影响,那么1024个字符的定义来自何处。

3 个答案:

答案 0 :(得分:3)

我不知道您是如何识别1024的,但可能是BUFSIZBUFSIZ中定义了stdio.h

  

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

修改

以下是glibc说的内容:

  

宏:int BUFSIZ   此宏的值是一个整数常量表达式   很适合用于size参数   调用setvbuf。保证这个值   至少256

     

在每个系统上选择BUFSIZ的值以便进行流I / O.   高效。所以使用它是个好主意   BUFSIZ作为缓冲区的大小   你打电话给setvbuf。

编辑2

@larsmans是对的。我查看了setvbuf是如何实现的,它在请求行缓冲并呈现NULL buf时忽略了一个调用。现在,stdout不是普通文件,它附加到终端。因此,请转到pixelbeat

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

答案 1 :(得分:1)

根据(草案)C标准,

  

如果buf不是空指针,则可以使用它指向的数组而不是setvbuf函数分配的缓冲区,参数size指定数组的大小;否则,size 可能确定setvbuf函数分配的缓冲区的大小。 [重点补充。]

所以,假设你测得正确,似乎Glibc可以随心所欲地做,因为当buf为空时,它会给你一个1kB的缓冲区。由于你从不写新行,行缓冲没有效果,行为类似于完全缓冲。

答案 2 :(得分:0)

大小可能对NULL buf指针没有太大影响。

但是,您仍在使用_IOLBF请求缓冲输出,请尝试_IONBF

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