Avant d'appeler fflush code> puis-je envisager fwrite code> pour être = une écriture non bloquante?
Sinon, pourquoi pas et quelles sont mes alternatives? P>
3 Réponses :
fwrite () bloque. fwrite () peut appeler fflush () à tout moment. p>
Si tout ce dont vous avez besoin pour tamponner, alors tampon dans votre propre tableau. Le tampon de FCRITE est généralement quelques k. P>
Toute façon de forcer la fflush () en interne? Parce que c'est waht j'ai besoin .. Je viens d'appeler "écrire" et cela le pose dans un tampon et retourne immédiatement et peut-être qu'il commence à écrire peut-être pas, mais cela n'a pas arrêté mon programme jusqu'à ce que j'appelle mon programme
Le Conceptuellement, si vous voulez des écrires non bloquants garantis dans toutes les conditions, vous avez besoin de tampons potentiellement infinis, ce qui peut être un peu coûteux. Vous pouvez faire vos propres fonctions pour la mise en mémoire tampon (dans un bloc de RAM, à l'aide de fwrite () code> mai em> bloc. Il utilise (généralement) un tampon interne avec une longueur maximale. Il enverra les données (tout ou partie de son tampon interne) lorsque le tampon devient plein. P>
setbuf () code> et SETVBUF () code> Les fonctions vous permettent de modifier la longueur maximale de la mémoire tampon et fournissez réellement le bloc pour le tampon, mais les détails dépendent de la mise en œuvre, mais Donc, vous devrez lire la documentation de votre bibliothèque C spécifique. P>
realloc () code> pour le faire pousser si nécessaire) et écrivez (avec fwrite () code> et Possible fflush () code>) seulement à la fin. Vous pouvez également essayer d'utiliser des E / S non bloquantes dans lesquelles des fonctions d'écriture ne bloquent jamais mais peuvent répondre qu'elles refusent d'accepter vos données en raison de la congestion interne. Les E / S non bloquantes ne font pas partie de la norme C elle-même (il n'y a pas de F * () code> fonction pour cela) mais peut être trouvé sous différents noms sur certains systèmes (par exemple avec FCNTL () code> et écriture () code> sur des systèmes UNIX). P>
Il est également important de noter que même si FLEHRITE bloque, tout ce qu'il fait certainement, c'est de remettre ses données sur la couche du noyau / du système de fichiers. Le noyau fera généralement la mise en mémoire tampon de son propre plutôt que de synchroniser les données sur le disque.
techniquement fwrite () code> est un appel de blocage en ce sens qu'il ne revient pas tant que la procédure n'est pas terminée. Toutefois, la définition de l'achèvement de fwrite () code> est que les données que vous fournissez ont été écrites dans un tampon de fichier interne. À titre d'effet secondaire, une partie de ce tampon peut également être écrite sur le disque dans le cadre de l'appel fwrite () code> mais vous ne pouvez pas compter sur ce comportement. Si vous avez absolument besoin que les données soient sur le disque, vous devez appeler fflush () code>. P>
Si cela est vrai, cela fait exactement ce dont j'ai besoin. Par non-blocage, je voulais juste dire que cela ne devrait pas bloquer tout en écrivant sur le disque. Je dois juste donner un énorme tampon
Notez que FFLUSH ne garantit que les données d'Userland dans le noyau. Le noyau les tampons également si vous perdez de l'énergie, vous risquez de perdre les données. Si vous voulez vraiment les données sur disque, vous devez effectuer un FSYNC (Fileno (FP)); Code>
Eh bien, comme je l'ai dit ci-dessus, un effet secondaire d'appel de FLE () est que cela pourrait rincer son mémoire tampon interne sur le disque. Cette indétermination entraînera une gigue significative dans la durée des appels de temps à la prise de FRWRITE (). Comme Thomas Pornin a dit que vous pouvez définir la taille de la mémoire tampon, mais que les détails de la touche FLEHRITE () affleureront que sa mémoire tampon sur le disque dépend de la mise en œuvre. Si vous voulez vraiment un équivalent déterministe non bloquant non bloquant (), vous devez soit reporter le traitement à un thread séparé ou écrivez vos données dans une zone de mise en scène intermédiaire de la mémoire, puis appellez-la une fois à la fin.