J’ai cette paix de code simple:
#include int main() { fprintf(stdout , "stdout \n"); fprintf(stderr , "stduerr \n"); return 0; } Output: stdout stderr
Je sais que stdout est tamponné et que stderr ne l’est pas et que je connais un flush de nouvelle ligne
le résultat sous Windows et netbeans est:
stdout stderr
le résultat en utilisant mac et Eclipse:
stderr stdout
et vous voulez savoir pourquoi …
Merci beaucoup …
stdout
par défaut (sur votre système de toute façon) est mis en tampon de ligne, ce qui signifie qu’il sera vidé lorsque vous le videz, ou lorsque vous insérez un caractère de nouvelle ligne ‘\ n’, ce que vous faites ici:
fprintf(stdout , "stdout \n");
Plus sur la mise en mémoire tampon de stdout:
Si l’on sait que stdout ne fait pas référence à un périphérique interactif, le stream est entièrement mis en mémoire tampon. Autrement, la bibliothèque dépend du fait que le stream de données soit mis en tampon de ligne ou non par défaut (voir setvbuf).
La source
Avec stdio(3)
les stream de sortie faisant référence à des périphériques terminaux sont mis en tampon de ligne comme stdout
, tandis que stderr
n’est pas en tampon.
Le programme ci-dessus se termine immédiatement après fprintf, donc stdout
est vidé.
Si vous voulez voir les différences de comportement, redirigez stdout et stderr vers un fichier, puis ajoutez quelques lignes fprintf
supplémentaires.
Comme d’autres l’ont déjà noté, vous obtiendrez le résultat escompté si vous utilisez
fprintf(stdout, "STDOUT"); fprintf(stderr, "STDERR");
Cela est dû au fait que la sortie standard du terminal Linux par défaut est une ligne mise en mémoire tampon tandis que stderr n’est pas en mémoire tampon.
Vous devrez vider stdout ou imprimer manuellement un ‘\ n’ sur stdout avant l’impression sur stderr. Ensuite, vous le verrez avant le message stderr.
Notez qu’il est également possible de désactiver la mise en mémoire tampon pour stdout.