fflush(3)
Fonction de la bibliothèque C
Force l'écriture des octets qu'un flux de sortie garde en mémoire. Indispensable avant un crash possible ou un fork, sans effet garanti sur stdin.
#include <stdio.h>
int fflush(FILE *stream);Description
Les flux de <stdio.h>, comme stdout ou un fichier ouvert avec fopen, accumulent ce que tu écris dans un tampon et ne le transmettent au noyau, avec write(2), qu'à certains moments : un \n quand stdout est un terminal, un tampon plein, la fin normale du programme. fflush(flux) transmet tout de suite ce qui attend. fflush(NULL) le fait pour tous les flux de sortie ouverts.
fflush ne vide que le tampon de la bibliothèque C. Une fois les octets passés au noyau, rien ne garantit qu'ils sont déjà sur le disque ; c'est le rôle de fsync.
Valeur de retour
0 en cas de succès. En cas d'erreur, EOF, et errno indique la cause, par exemple EBADF si le flux n'est pas ouvert en écriture.
Pièges
fflush(stdin)ne vide pas le clavier. La norme C ne définitfflushque pour les flux de sortie, et POSIX ne l'étend qu'aux fichiers sur disque. Pour jeter la fin d'une ligne tapée, lis-la jusqu'au\n.Un crash ou un
abortn'appelle pasfflushà ta place. Depuis glibc 2.27,aborttermine le processus sans vider les flux, comme le montre l'exemple.Le texte d'une invite sans
\npeut rester invisible pendant une lecture : avec musl, la bibliothèque du terminal des exercices Grademe,stdoutn'est pas vidé avant unscanf. Écrisfflush(stdout)entre l'invite et la lecture.Avant un
fork, videstdout: sinon le texte en attente est copié dans l'enfant et s'affiche deux fois.
Exemple
#include <stdio.h>#include <stdlib.h>
int main(void){ printf("Sauvegarde en cours..."); fflush(stdout); abort();}sans-fflush.c est le même programme sans la ligne 7.
$ ./sans-fflushAborted$ ./avec-fflushSauvegarde en cours...AbortedSans fflush, le message attendait la fin de sa ligne dans le tampon, et abort l'a fait disparaître. L'article printf n'affiche rien avant un crash détaille les trois modes de tampon.