当我运行以下代码时似乎:
#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个字符的定义来自何处。
答案 0 :(得分:3)
我不知道您是如何识别1024
的,但可能是BUFSIZ
。 BUFSIZ
中定义了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)