2010-03-22 8 views

Répondre

3

Techniquement, fwrite() est un appel bloquant en ce sens qu'il ne retourne pas tant que la procédure n'est pas terminée. Cependant, la définition de l'achèvement pour fwrite() est que les données que vous fournissez ont été écrites dans un tampon de fichier interne. En tant qu'effet secondaire, une partie de ce tampon peut également être écrite sur le disque dans le cadre de l'appel fwrite() mais vous ne pouvez pas vous fier à ce comportement. Si vous avez absolument besoin que les données soient sur le disque, vous devez appeler fflush().

+0

Si cela est vrai, alors il fait exactement ce dont j'ai besoin. En ne bloquant pas, je voulais juste dire qu'il ne devrait pas bloquer lors de l'écriture sur le disque .. J'ai juste besoin de mettre un tampon énorme –

+1

Notez que fflush ne garantit que les données sont déplacées de l'utilisateur dans le noyau. Le noyau tampon aussi, donc si vous perdez de la puissance, vous pouvez toujours perdre les données. Si vous voulez vraiment les données sur le disque, vous devrez faire 'fsync (fileno (fp));' –

+0

Eh bien, comme je l'ai dit ci-dessus, un effet secondaire de l'appel fwrite() est qu'il pourrait vider son tampon interne disque. Cette indétermination provoquera une instabilité significative dans la durée des appels à fwrite(). Comme Thomas Pornin a dit que vous pouvez définir la taille de la mémoire tampon, mais les détails de quand fwrite() va vider son tampon sur le disque dépendent de l'implémentation. Si vous voulez vraiment un équivalent fwrite() déterministe non bloquant, vous devrez soit reporter ce traitement dans un thread séparé, soit écrire vos données dans la zone intermédiaire de la mémoire, puis appeler fwrite() une fois à la fin. –

2

fwrite() bloque. fwrite() peut appeler fflush() en interne à tout moment.

Si tout ce dont vous avez besoin pour mettre en mémoire tampon, alors tampon dans votre propre tableau. Le tampon de fwrite est typiquement un peu de K.

+0

Un moyen de forcer fwrite à ne pas fflush() en interne? Parce que c'est waht j'ai besoin .. je viens d'appeler "écrire" et il met dans un tampon et retourne immédiatement et peut-être qu'il commence à écrire peut-être pas mais il n'arrête pas mon programme jusqu'à ce que j'appelle flush –

7

fwrite()peut bloquer. Il utilise (généralement) un tampon interne d'une longueur maximale. Il enverra les données (tout ou partie de son tampon interne) lorsque le tampon sera plein. Les fonctions setbuf() et setvbuf() vous permettent de modifier la longueur maximale du tampon et fournissent le bloc pour le tampon, mais les détails dépendent de l'implémentation, vous devrez donc lire la documentation de votre bibliothèque C spécifique. D'un point de vue conceptuel, si vous souhaitez garantir des écritures non bloquantes dans toutes les conditions, vous avez besoin de tampons potentiellement infinis, ce qui peut être un peu coûteux. Vous pouvez créer vos propres fonctions pour mettre en mémoire tampon les données (dans un bloc de RAM, en utilisant realloc() pour les agrandir si nécessaire) et écrire (avec fwrite() et fflush() possible) seulement à la fin. Vous pouvez également essayer d'utiliser des E/S non bloquantes dans lesquelles les fonctions d'écriture ne bloquent jamais mais peuvent répondre qu'elles refusent d'accepter vos données en raison d'une congestion interne. Les E/S non bloquantes ne font pas partie de la norme C elle-même (il n'y a pas de fonction f*() pour cela) mais peuvent être trouvées sous différents noms sur certains systèmes (par exemple avec fcntl() et write() sur les systèmes Unix).

+0

Il est également important de noter que Même si les blocs fwrite, tout ce qu'il fait est définitivement de transmettre ses données à la couche noyau/système de fichiers. Le noyau effectuera généralement sa propre mise en mémoire tampon plutôt que de synchroniser les données sur le disque immédiatement. –

Questions connexes