langage - scanf c




Les résultats de printf() et system() sont dans le mauvais ordre lorsque la sortie est redirigée vers un fichier (2)

Il est lié à la mise en mémoire tampon de sortie. J'ai réussi à reproduire le même comportement. Forcer le flush l'a fait pour moi.

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

int main(int argc, char ** argv) {
  printf("this is a test message.\n");
  fflush(stdout);
  system("ls");

  return 0;
}

Avant d'ajouter le fflush:

$ ./main > foo
$ cat foo
main
main.c
this is a test message.

et après:

$ ./main > foo
$ cat foo
this is a test message.
foo
main
main.c

J'ai un programme C qui compile un exécutable appelé myprogram. C'est sa fonction principale:

int main(int argc, char ** argv) {
  printf("this is a test message.\n");
  system("ls");

  return 0;
}

Lorsque myprogram > output.txt dans un shell Linux, puis que j'examine output.txt, la sortie de ls listée ci-dessus: "ceci est un message de test".

Je pense que ce devrait être l'inverse. Pourquoi cela se produit-il et que puis-je faire pour que "ceci soit un message de test" apparaisse en haut du fichier output.txt?

Si cela compte, je suis nouveau dans C et travaille dans une ligne de commande.


J'imagine que c'est à cause de l'ordre dans lequel le tampon stdout est vidé, ce qui n'est pas nécessairement déterministe. Il est possible que le parent génère le processus ls et ne vide pas sa propre sortie standard après son retour. En fait, il est possible que la vidange ne soit pas vidée avant la fin du processus.

Essayez d’ajouter fflush (stdout) après l’instruction printf et voyez si cela force la sortie à apparaître en premier.





io-redirection