我在网上的某个地方看到了片段。以下程序不打印“hello-out”。我觉得的原因是因为它实际上是从缓冲区刷新到控制台之前的,
#include <stdio.h>
#include <unistd.h>
int main()
{
while(1)
{
fprintf(stdout,"hello-out");
fprintf(stderr,"hello-err");
sleep(1);
}
return 0;
}
我的理由是否正确?如果不是正确的原因是什么?
答案 0 :(得分:2)
您应该将\n
放在字符串的末尾以使其刷新,或使用fflush
将其强制删除。
答案 1 :(得分:1)
以下修复的原因是因为我确实知道默认情况下stdout是行缓冲的,而stderr则不是。
#include <stdio.h>
#include <unistd.h>
int main()
{
while(1)
{
fprintf(stdout,"hello-out");
fflush(stdout);
// sleep(1);
fprintf(stderr,"hello-err");
sleep(1);
}
return 0;
}
更新另一种“修复”它而不更改源代码的方法是使用例如stdbuf
:
stdbuf -o 0 ./test
也将标准输出切换到非缓冲模式。有趣的是,如果你指定
stdbuf -e L ./test
使stderr行缓冲,也不会出现任何输出(直到第一个lineend被打印)