我写了以下编程:
int main()
{
printf("one\n");
write(1, "two\n", 4);
return 0;
}
然后我发出命令 ./a.out |猫 在输出到的终端 二 一 代替 一 二 为什么???
答案 0 :(得分:11)
那是因为printf
的输出将被libc
缓冲,write
的输出将不会被缓冲。它是直接,文件上的无缓冲操作(stdout)
阅读this:
如果stdout是终端,则缓冲自动设置为行缓冲,否则设置为缓冲
所以,你实际上已经到了cat
- 这就是启用缓冲的原因(尝试没有cat
来看)
要关闭缓冲问题stdbuf
命令:
stdbuf -o0 ./a.out | cat
顺便说一下,要求一个不是每天都是C黑客的人,这是一个非常好的问题!简单而具有描述性!
答案 1 :(得分:4)
正如hek2mgl指出的那样,这是因为缓冲。如果你想逼迫,你可以在fflush(stdout)
之后加printf
。