web-dev-qa-db-fra.com

Tampons de rinçage en C

fflush() ne devrait-il pas être utilisé pour vider un tampon, même s'il s'agit d'un flux de sortie?

A quoi sert-il? Comment vidons-nous un tampon en général?

52
saadtaame

Vider les tampons de sortie:

printf("Buffered, will be flushed");
fflush(stdout); // Prints to screen or whatever your standard out is

ou

fprintf(fd, "Buffered, will be flushed");
fflush(fd);  //Prints to a file

Peut être une technique très utile. Pourquoi voudriez-vous vider un tampon de sortie? Habituellement, lorsque je le fais, c'est parce que le code plante et que j'essaie de déboguer quelque chose. La mémoire tampon standard ne s’imprimera pas à chaque appel de printf(); Donc, si vous essayez de vérifier si vous appelez une fonction avant un plantage, il est utile de printf quelque chose comme "got here!", Et parfois le tampon n'a pas été vidé avant le un crash se produit et vous ne pouvez pas dire à quel point vous êtes vraiment arrivé.

Une autre fois que cela est utile est le code multi-processus ou multi-thread. Encore une fois, le tampon ne vide pas toujours l'appel d'un printf(), donc si vous voulez connaître le véritable ordre d'exécution de plusieurs processus, vous devez vider le tampon après chaque impression.

Je prends l'habitude de le faire, cela me épargne beaucoup de maux de tête lors du débogage. Le seul inconvénient auquel je puisse penser est que printf() est une opération coûteuse (c'est pourquoi il ne vide pas le tampon par défaut).


En ce qui concerne le vidage du tampon d'entrée (stdin), vous ne devriez pas le faire. Flushing stdin est un comportement indéfini selon la norme C11 §7.21.5.2 partie 2:

Si le flux pointe vers un flux de sortie ... la fonction fflush provoque l'écriture de toutes les données non écrites pour ce flux ... dans le fichier; sinon, le comportement n'est pas défini.

Sur certains systèmes, Linux étant un exemple, comme vous pouvez le constater dans la page de manuel de fflush() , il existe un comportement défini, mais il dépend du système pour que votre code ne soit pas portable.

Maintenant, si vous vous inquiétez des déchets "bloqués" dans le tampon d'entrée, vous pouvez utiliser fpurge() pour cela. Voir ici pour plus d'informations sur fflush() et fpurge()

88
Mike