重定向的输出不见了?

写一个简单的程序,比如这样

#include 
#include 

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后都fflush(stdout),或者提前用setvbuf把stdout设置为line buffered或unbuffered,如
setvbuf(stdout, NULL, _IONBF, 0); // set stdout unbuffered

对于无法修改的程序,恐怕只能想一些奇技淫巧了。

你可能感兴趣的:(重定向的输出不见了?)