写一个简单的程序,比如这样
#include <stdio.h>
#include <unistd.h>
int main()
{
for (int i = 0; ; ++i) {
printf("num %d\n", i);
sleep(1);
}
return 0;
}
编译执行,当然没有任何问题。然后这样:
./a.out | grep num
却没有任何输出!
被此问题困扰了几分钟之久(当然原问题没有这么简单),后来发现是Linux的输出缓冲机制惹的祸。我们都知道输出到stdout的时候每次有换行就会清空输出缓冲区,但其实只有当stdout是终端的时候才是如此,当重定向到管道或文件的时候都要等缓冲区满才