Pourquoi l’ordre de sortie d’un programme C est-il différent lorsque sa sortie standard est redirigée vers un fichier?

Voici mon programme

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

Voici la sortie.

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

Cependant, si je redirige la sortie du programme vers un fichier, je vois que l’ordre de sortie est inversé, c’est-à-dire que Linux est imprimé avant Hello .

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

Pourquoi l’ordre de sortie est-il différent lorsque la redirection est impliquée?

C’est parce que stdout est tamponné de différentes manières. Lorsque vous appelez votre programme sans la redirection, la mise en mémoire tampon par défaut est mise en mémoire tampon. Dans le deuxième appel, le tampon est beaucoup plus volumineux et écrit lorsque votre programme se termine. Puisque votre appel à uname terminé avant, cette sortie apparaît maintenant plus tôt dans le fichier. Lorsque vous dépendez de la commande, vous pouvez soit appeler explicitement fflush(stdout) après votre appel printf , soit appeler uname via popen et imprimer sa sortie de manière explicite.

Comme la mise en mémoire tampon est effectuée sur le terminal, l’ordre de sortie peut être différent.