写一个简单的程序,比如这样
#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是终端的时候才是如此,当重定向到管道或文件的时候都要等缓冲区满才会真正输出。默认的缓冲区大小是4096字节,所以上面的命令在“假死“大约17分钟后会给出输出。
解决方法:每次printf后都f