GNU/Linux >> Tutoriels Linux >  >> Linux

Quelle est la différence entre fsync et syncfs ?

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é par fildes doit être transféré sur le périphérique de stockage associé au fichier décrit par fildes . La nature du transfert est définie par l'implémentation. Le fsync() 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 comme sync() , mais synchronise uniquement le fichier contenant le système de fichiers référencé par le descripteur de fichier ouvert fd .

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 fichier fd 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 un fsync() 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é :

  1. POSIX fsync() :"veuillez écrire les données de ce fichier sur le disque"
  2. POSIX sync()  :"écrire toutes les données sur le disque lorsque vous y arrivez"
  3. Linux sync()  :"écrire toutes les données sur le disque (quand vous y arriverez ?)"
  4. Linux syncfs()  :"écrire toutes les données du système de fichiers associé à ce fichier sur le disque (lorsque vous y arriverez ?)"
  5. 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 donc sync() ousyncfs() offrent les mêmes garanties que fsync 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".


Linux
  1. Quelle est la différence entre l'écriture dans un fichier et une mémoire mappée ?

  2. Quelle est la différence entre strtok_r et strtok_s en C ?

  3. Quelle est la différence entre fsck et e2fsck ?

  4. Quelle est la différence entre adduser et useradd ?

  5. Quelle est la différence entre ls et l ?

Quelle est la différence entre Linux et Unix ?

Quelle est la différence entre la connexion et le shell sans connexion

Quelle est la différence entre la commande apt et apt-get ?

Qu'est-ce qu'un Hyperviseur ? Quelle est la différence entre les types 1 et 2 ?

Quelle est la différence entre curl et Wget ?

Quelle est la différence entre unlink et rm ?