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

aln*_*net 5 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;
}
Run Code Online (Sandbox Code Playgroud)

无论我为 setvbuf() 定义的大小如何,它都会以 1024 个字符为单位进行打印。问题是在这种情况下大小是否会产生某种影响以及 1024 个字符的定义来自哪里。

cni*_*tar 4

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

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

编辑

这里有一句话glibc说:

宏:int BUFSIZ 该宏的值是一个整型常量表达式,适合用作 setvbuf 的大小参数。该值保证至少为 256

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

编辑2

@larsmans 是对的。我查看了如何setvbuf实现,并且在请求行缓冲并呈现 NULL buf 时它会忽略调用。现在,stdout这不是普通文件,它附加到终端。所以,转向Pixelbeat

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