当stdout被重定向到文件时,为什么C程序的输出顺序不同?

时间:2017-01-03 06:52:12

标签: c linux output io-redirection

这是我的计划。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("Hello\n");
    system("uname");
    return 0;
}

这是输出。

$ gcc foo.c
$ ./a.out 
Hello
Linux

但是,如果我将程序的输出重定向到文件,我会看到输出的顺序是相反的,即在Linux之前打印Hello

$ ./a.out > out.txt
$ cat out.txt
Linux
Hello

为什么涉及重定向时输出的顺序不同?

2 个答案:

答案 0 :(得分:2)

由于在终端上进行缓冲,输出顺序可能不同。

答案 1 :(得分:2)

这是因为stdout以不同方式缓冲。在没有重定向的情况下调用程序时,缓冲默认为行缓冲。在第二次调用中,缓冲区要大得多,并在程序终止时写入。由于之前对uname的调用已终止,此输出现在会在文件的前面显示。当您依赖订购时,您可以在fflush(stdout)来电后明确致电printf,也可以通过uname致电popen并明确打印其输出。