[英]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
。 BUFSIZ
在stdio.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的缓冲区。 由于您从不编写换行符,因此行缓冲无效,其行为类似于完全缓冲。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.