将输出管道输送到cat

时间:2013-04-27 23:39:28

标签: c linux cat

我写了以下编程:

int main() 
{
printf("one\n");
write(1, "two\n", 4);
return 0;
}

然后我发出命令 ./a.out |猫 在输出到的终端 二 一 代替 一 二 为什么???

2 个答案:

答案 0 :(得分:11)

那是因为printf的输出将被libc缓冲,write的输出将不会被缓冲。它是直接文件上的无缓冲操作(stdout)

阅读this

  

如果stdout是终端,则缓冲自动设置为行缓冲,否则设置为缓冲

所以,你实际上已经到了cat - 这就是启用缓冲的原因(尝试没有cat来看)

要关闭缓冲问题stdbuf命令:

stdbuf -o0 ./a.out  | cat 

顺便说一下,要求一个不是每天都是C黑客的人,这是一个非常好的问题!简单而具有描述性!

答案 1 :(得分:4)

正如hek2mgl指出的那样,这是因为缓冲。如果你想逼迫,你可以在fflush(stdout)之后加printf