我的机器正在运行ubuntu 10.10,我正在使用标准的gnu C库.我的印象是,如果格式字符串中描述了换行符,printf会刷新缓冲区,但是下面的代码反复出现了这种趋势.有人可以澄清为什么缓冲区没有被刷新.
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
int main()
{
int rc;
close(1);
close(2);
printf("HI 1\n");
fprintf(stderr, "ERROR\n");
open("newfile.txt", O_WRONLY | O_CREAT | O_TRUNC, 0600);
printf("WHAT?\n");
fprintf(stderr, "I SAID ERROR\n");
rc = fork();
if (rc == 0)
{
printf("SAY AGAIN?\n");
fprintf(stderr, "ERROR ERROR\n");
}
else
{
wait(NULL);
}
printf("BYE\n");
fprintf(stderr, "HI 2\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行该程序后newfile.txt的内容如下.
HI 1
WHAT?
SAY AGAIN?
BYE
HI 1
WHAT?
BYE
Run Code Online (Sandbox Code Playgroud)
pax*_*blo 26
不,标准说stdout
如果输出设备可以被确定为非交互设备,那么它最初是完全缓冲的.
这意味着,如果您重定向stdout
到文件,它将不会刷新换行符.如果您想尝试强制它进行行缓冲,请使用setbuf
或setvbuf
.
C99的相关部分7.19.3 Files, paragraph 7
指出:
在程序启动时,预定义了三个文本流,无需明确打开 - 标准输入(用于读取常规输入),标准输出(用于写入常规输出)和标准错误(用于写入诊断输出).最初打开时,标准错误流未完全缓冲; 当且仅当可以确定流不参考交互设备时,标准输入和标准输出流被完全缓冲.
请记住部分5.1.2.3/6
:
构成交互设备的是实现定义的.