似乎当我运行以下代码时:
#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 个字符的定义来自哪里。
我不知道你是如何识别的,1024但可能是BUFSIZ。BUFSIZ定义于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