rename(MonFichier.temp, MonFichier).
Et si c'est lent il faut le mettre dans un thread.
OK dans un thread tu auras la main pour faire autre chose (cas d'un éditeur : sauvegarde temporaire par exemple). Mais dans le cas général où tu souhaite enregistrer un fichier et sortir du processus, le thread ne changera pas le problème de fond qui est que l'opération fsync() prend du temps : il ne paraît pas sain de terminer le processus avant que le fsync() n'ait rendu la main, donc avant que le thread n'ait terminé son travail ; donc on ne gagne pas temps dans ce cas là.
À noter que le rename() final effectue deux opérations d'un coup :
1 - effacer le fichier MonFichier
2 - renommer
Même si 1 et 2 sont atomiques (comme dit plus haut, vu du système, si rien ne crashe), l'opération 1 peut prendre un certain temps selon la taille du fichier et le système de fichiers.
[^] # Re: Forme canonique d'écriture de fichier
Posté par Laurent Morel . En réponse à la dépêche Le noyau Linux 2.6.30 est disponible. Évalué à 2.
Et si c'est lent il faut le mettre dans un thread.
OK dans un thread tu auras la main pour faire autre chose (cas d'un éditeur : sauvegarde temporaire par exemple). Mais dans le cas général où tu souhaite enregistrer un fichier et sortir du processus, le thread ne changera pas le problème de fond qui est que l'opération fsync() prend du temps : il ne paraît pas sain de terminer le processus avant que le fsync() n'ait rendu la main, donc avant que le thread n'ait terminé son travail ; donc on ne gagne pas temps dans ce cas là.
À noter que le rename() final effectue deux opérations d'un coup :
1 - effacer le fichier MonFichier
2 - renommer
Même si 1 et 2 sont atomiques (comme dit plus haut, vu du système, si rien ne crashe), l'opération 1 peut prendre un certain temps selon la taille du fichier et le système de fichiers.