Avant d'appeler le fflush
, puis-je considérer fwrite
comme étant une écriture non bloquante? Si non, pourquoi pas et quelles sont mes alternatives?Est-ce que fwrite est non-bloquant?
Répondre
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().
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.
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 –
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).
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. –
- 1. fwrite txt fichier
- 2. NSOperation et fwrite (Iphone)
- 3. C Programmation - Fichier - fwrite
- 4. Problème avec fwrite php
- 5. Pourquoi la fonction fwrite libc est plus rapide que la fonction d'écriture syscall?
- 6. PHP - Les lacunes de fwrite?
- 7. fwrite() rien écrit, entrées vides
- 8. Remplacer le contenu dans PHP fwrite()
- 9. \ n ne fonctionne pas dans mon fwrite()
- 10. Problème PHP fopen/fwrite sur IIS7
- 11. fwrite avec structs contenant une matrice
- 12. fwrite ne rompt pas la ligne
- 13. Qu'est-ce qui peut provoquer le blocage de fwrite?
- 14. valeur des modifications de données char après fwrite
- 15. C - fwrite() ne pas sortir dans le fichier
- 16. Puis-je utiliser fwrite php avec 644 autorisations de fichiers?
- 17. PHP4 problèmes avec include() dans un fichier créé par fwrite()
- 18. PHP - Fwrite() sauvegardera-t-il le fichier immédiatement?
- 19. Comment écrire une structure dans un fichier en utilisant fwrite?
- 20. Vérification du succès de fwrite en C, perror
- 21. Avoir un problème avec fwrite en PHP - Quel est le problème avec mon code?
- 22. C++ versions de PHP fsockopen, fread, fwrite, FCLOSE?
- 23. Enveloppe de fichier lors de l'utilisation de fwrite
- 24. Mon fwrite à une socket n'est pas vidé, jusqu'à ce que le socket se ferme. Comment changer?
- 25. PHP fwrite renvoie toujours le nombre d'octets à écrire même si le fichier n'existe pas, est ce comportement attendu?
- 26. Est-ce que `extend` est plus rapide que` + = `?
- 27. Est-ce que SOAPpy est la même chose que SOAPy?
- 28. Est-ce que MOTODEV est plus rapide que l'émulateur Android?
- 29. Que * est * un IPM.DistList?
- 30. Alternatives à fread et fwrite pour une utilisation avec des données structurées
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 –
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));' –
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. –