2017-01-03 10 views
6

Вот моя программа.Почему порядок вывода программы на C отличается, когда его stdout перенаправляется в файл?

#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 

Почему порядок вывода отличается при перенаправлении?

ответ

3

Это потому, что stdout буферизуется по-разному. Когда вы вызываете свою программу без перенаправления, буферизация по умолчанию используется для буферизации по линии. Во втором вызове буфер намного больше и записывается, когда ваша программа завершается. Поскольку ваш звонок до uname завершен раньше, этот вывод теперь отображается ранее в файле. Когда вы зависите от заказа, вы можете либо явным образом позвонить fflush(stdout) после вашего звонка printf, либо вы можете позвонить uname через popen и распечатать его вывод явным образом.

2

Поскольку буферизация выполняется на терминале, порядок вывода может отличаться.

+0

Неправильно. Даже если терминал делает буферизацию (я думаю, что нет), он имеет только один «входной приемник»: переупорядочение данных там не может быть. – linuxfan