D'abord, fsync()
(et sync()
) sont des fonctions standard POSIX tandis que syncfs()
est Linux uniquement.
La disponibilité est donc une grande différence.
Du standard POSIX pour fsync()
:
Le
fsync()
la fonction doit demander que toutes les données du descripteur de fichier ouvert nommé parfildes
doit être transféré sur le périphérique de stockage associé au fichier décrit parfildes
. La nature du transfert est définie par l'implémentation. Lefsync()
la fonction ne doit pas revenir tant que le système n'a pas terminé cette action ou jusqu'à ce qu'une erreur soit détectée.
Notez qu'il ne s'agit que d'une demande.
Du standard POSIX pour sync()
:
Le
sync()
la fonction doit faire en sorte que toutes les informations en mémoire qui mettent à jour les systèmes de fichiers soient programmées pour écriture vers tous les systèmes de fichiers.L'écriture, bien que programmée, n'est pas forcément terminée au retour du
sync()
.
Encore une fois, ce n'est pas quelque chose de garanti.
La page de manuel Linux pour syncfs()
(et sync()
) indique
sync()
entraîne l'écriture de toutes les modifications en attente des métadonnées du système de fichiers et des données de fichiers mis en cache dans les systèmes de fichiers sous-jacents.
syncfs()
est commesync()
, mais synchronise uniquement le fichier contenant le système de fichiers référencé par le descripteur de fichier ouvertfd
.
Notez que quand la fonction renvoyée n'est pas spécifiée.
Le Linux page de manuel pour fsync()
indique :
fsync()
transfère ("vide") toutes les données internes modifiées (c'est-à-dire les pages de cache de tampon modifiées pour) le fichier référencé par le descripteur de fichierfd
au périphérique de disque (ou à un autre périphérique de stockage permanent) afin que toutes les informations modifiées puissent être récupérées même si le système tombe en panne ou est redémarré. Cela inclut l'écriture ou le vidage du cache du disque s'il est présent. L'appel est bloqué jusqu'à ce que l'appareil signale que le transfert est terminé.En plus de vider les données du fichier,
fsync()
vide également les informations de métadonnées associées au fichier (voir inode(7)).Appeler le
fsync()
ne garantit pas nécessairement que l'entrée du répertoire contenant le fichier a également atteint le disque. Pour cela unfsync()
explicite sur un descripteur de fichier pour le répertoire est également nécessaire.
Notez que les garanties fournies par Linux pour fsync()
sont beaucoup plus forts que ceux fournis pour sync()
ou syncfs()
, et par POSIX pour les deux fsync()
et sync()
.
En résumé :
- POSIX
fsync()
:"veuillez écrire les données de ce fichier sur le disque" - POSIX
sync()
:"écrire toutes les données sur le disque lorsque vous y arrivez" - Linux
sync()
:"écrire toutes les données sur le disque (quand vous y arriverez ?)" - Linux
syncfs()
:"écrire toutes les données du système de fichiers associé à ce fichier sur le disque (lorsque vous y arriverez ?)" - Linux
fsync()
:"écrivez toutes les données et métadonnées de ce fichier sur le disque et ne revenez pas tant que vous ne l'avez pas fait"
Notez que la page de manuel Linux ne précise pas quand sync()
et syncfs()
retour.
Je pense que la réponse actuelle n'est pas complète. Pour Linux :
Selon la spécification standard (par exemple, POSIX.1-2001),
sync()
planifie les écritures, mais peut revenir avant que l'écriture proprement dite ne soit terminée. Cependant, Linux attend la fin des E/S, et doncsync()
ousyncfs()
offrent les mêmes garanties quefsync
appelé respectivement sur chaque fichier du système ou du système de fichiers.
et
Avant la version 1.3.20, Linux n'attendait pas que les E/S se terminent avant de revenir.
Ceci est mentionné sur le sync(2)
page dans les sections "notes" et "bugs".