30 votes

Différence entre fflush et fsync

J'ai pensé à fsync() ne fflush() en interne afin d'utiliser fsync() sur un flux de données est OK. Mais j'obtiens le résultat inattendu lorsqu'il est exécuté sous réseau I/O.

Mon extrait de code:

  FILE* fp = fopen(file,"wb");    
   /* multiple fputs() call like: */   
   fputs(buf, fp);   
   ...   
   ...   
   fputs(buf.c_str(), fp);   
   /* get fd of the FILE pointer */   
   fd = fileno(fp);   
   #ifndef WIN32   
   ret = fsync(fd);   
   #else   
   ret = _commit(fd);   
   fclose(fp);   

Mais il semble _commit() n'est pas de rinçage les données (j'ai essayé sur Windows et les données ont été écrites sur Linux système de fichiers exporté).

Lorsque j'ai modifié le code comme:

 FILE* fp = fopen(file,"wb");   
   /* multiple fputs() call like: */   
   fputs(buf, fp);   
   ...   
   ...   
   fputs(buf.c_str(), fp);   
   /* fflush the data */   
   fflush(fp);   
   fclose(fp);    

Cette fois, il vide les données.

Je me demande si _commit() fait la même chose que fflush(). Toutes les entrées?

42voto

nos Points 102226

fflush() travaille sur un FICHIER* , c'est juste vide les tampons internes dans l' FILE* de votre application à l'OS.

fsync fonctionne sur un niveau inférieur, il raconte l'OS à vider ses tampons sur le média physique.

OSs lourdement met en cache les données que vous écrivez dans un fichier. Si le système d'exploitation appliquées chaque écriture de frapper le lecteur, les choses seraient très lente. fsync(entre autres choses) vous permet de contrôler le moment où les données doivent frapper le lecteur.

En outre, fsync/commettre des travaux sur un descripteur de fichier. Il n'a pas connaissance d'un FICHIER* et ne peut pas vider ses tampons. FICHIER* vit dans votre application, descripteurs de fichiers vit dans le noyau de système d'exploitation, généralement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X