2017-01-03 10 views
6

Oto mój program.Dlaczego kolejność wyjścia programu C różni się, gdy jego standardowe wyjście jest przekierowywane do pliku?

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

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

Oto dane wyjściowe.

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

Jednak gdybym przekierować wyjście programu do pliku, widzę, że kolejność wyjścia jest odwrócony, tzn Linux jest drukowany przed Hello.

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

Dlaczego kolejność danych wyjściowych różni się w przypadku przekierowania?

Odpowiedz

3

Jest tak, ponieważ standardowe wyjście buforowane jest na różne sposoby. Gdy wywołujesz swój program bez przekierowania, buforowanie domyślnie buforuje liniowo. W drugim wywołaniu bufor jest znacznie większy i zapisywany, gdy twój program się zakończy. Ponieważ twoje połączenie z uname zostało zakończone wcześniej, to wyjście pojawi się wcześniej w pliku. Gdy polegasz na zamówieniu, możesz po prostu zadzwonić pod numer fflush(stdout) po rozmowie printf lub możesz zadzwonić pod numer uname poprzez popen i wydrukować bezpośrednio swoje wyjście.

2

Ponieważ buforowanie odbywa się na terminalu, kolejność wyników może być inna.

+0

Nieprawidłowy. Nawet jeśli terminal robi buforowanie (chyba nie), ma tylko jedno "ujście wejściowe": nie może się tam zmienić kolejności danych. – linuxfan

Powiązane problemy