2017-01-03 101 views
6

這是我的程序。爲什麼C程序的輸出順序在標準輸出重定向到文件時有所不同?

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

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

這裏是輸出。

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

但是,如果我的節目的輸出重定向到一個文件中,我看到的輸出的順序是相反的,即LinuxHello之前打印。

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

爲什麼在涉及重定向時輸出的順序不同?

回答

3

這是因爲stdout以不同的方式緩衝。當你在沒有重定向的情況下調用你的程序時,緩衝區默認爲逐行緩衝。在第二次調用中,緩衝區要大得多,並在程序終止時寫入。由於您之前致電uname終止,此輸出現在顯示在文件的較早部分。當您依賴訂單時,您可以在撥打printf之後直接撥打fflush(stdout),也可以通過popen撥打uname並直接打印輸出。

2

由於緩衝是在終端上完成的,輸出的順序可能不同。

+0

錯誤。即使終端緩衝(我認爲不是),它只有一個「輸入接收器」:數據的重新排序不會發生在那裏。 – linuxfan

相關問題