printf flush à la sortie du programme

Je suis intéressé à savoir comment la fonction printf() fonctionne lorsque le programme se termine.

Prenons le code suivant:

 int main(int ac, char **av) { printf("Hi"); return 0; } 

Dans ce cas, comment printf() parvient-il à vider son tampon vers stdout ?

Je suppose que cela dépend de la plate-forme, alors prenons Linux.

Il pourrait être implémenté en utilisant __atsortingbute__((dtor)) mais la bibliothèque standard dépendrait alors du compilateur. Je suppose que ce n’est pas la façon dont cela fonctionne.

Toute explication ou lien vers la documentation est apprécié. Je vous remercie.

Le runtime C enregistre les atexit() pour vider les tampons standard lorsque exit() est appelé.

Voir cette explication .

Lorsque le programme se ferme normalement, la fonction d’ exit a toujours effectué un arrêt propre de la bibliothèque d’E / S standard, ce qui entraîne le vidage de toutes les données de sortie mises en mémoire tampon.

Renvoyer une valeur entière à partir de la fonction principale équivaut à appeler exit avec la même valeur.Alors, le return 0 a le même effet avec exit(0)

Si _Exit ou _exit été appelé, le processus sera terminé immédiatement, l’IO ne sera pas vidé.

Juste pour élargir la réponse de trofanjoe:

exit provoque la fin normale du programme. Les fonctions atexit sont appelées dans l’ordre inverse de l’enregistrement, les fichiers ouverts sont vidés, les stream ouverts sont fermés et le contrôle est renvoyé à l’environnement.

et

Dans main , return expr est équivalent à exit (expr). exit a l’avantage de pouvoir être appelé depuis d’autres fonctions

De l’ man stdio sur ma machine ici (emphase ajoutée), qui exécute RHEL 5.8:

Un fichier peut être rouvert ultérieurement, par la même exécution du programme ou par un autre, et son contenu récupéré ou modifié (s’il peut être repositionné au début). Si la fonction principale retourne à l’appelant d’origine ou si la fonction exit (3) est appelée, tous les fichiers ouverts sont fermés (tous les stream de sortie sont donc vidés) avant la fin du programme. D’autres méthodes de terminaison de programme, telles que l’abandon (3), ne vous préoccupent pas de la fermeture correcte des fichiers.