FSYNC(2)

NOM
fsync, fdatasync - Synchroniser un fichier en mémoire avec le disque

SYNOPSIS
#include <unistd.h>

int fsync (int fd);

int fdatasync (int fd);

Exigences de macros de test de fonctionalités pour la glibc (voir feature_test_macros(7)) :

fsync() : _BSD_SOURCE || _XOPEN_SOURCE
fdatasync() : _POSIX_C_SOURCE >= 199309L || _XOPEN_SOURCE >= 500

DESCRIPTION
fsync() transfère (« flush ») tous les morceaux encore en mémoire (c'est-à-dire, les pages de cache tampon modifiées) du fichier référencé par le descripteur de fichier fd vers le périphérique disque (ou un autre périphérique de stockage permanent) où se trouve ce fichier. Cet appel bloque jusqu'à ce que le périphérique indique que le transfert est fini. Il vide aussi les informations de métadonnées associées au fichier (voir stat(2)). L'appel à fsync() n'assure pas obligatoirement que les informations concernant le répertoire aient atteint le disque. Pour cela, un appel explicite de fsync() sur le descripteur de fichier du répertoire est nécessaire. fdatasync(2) est similaire à fsync() mais il ne vide pas les métadonnées modifiées à moins que ces métadonnées ne soient nécessaires pour permettre une gestion correcte d'une récupération ultérieure des données. Par exemple, la modification de st_atime ou st_mtime (respectivement l'heure du dernier accès et l'heure de dernière modification ; voir stat(2)) ne nécessite pas le vidage car ils ne sont pas nécessaires à une gestion correcte dee lecture de données ultérieure. D'un autre coté, une modification de la taille du fichier (st_size, comme réalisée par, par exemple ftruncate(2)), nécessite un vidage des métadonnées. Le but de fdatasync(2) est de réduire l'activité disque pour des applications qui ne nécessitent
 pas que les métadonnées soient synchronisées avec le disque.

VALEUR RENVOYÉE
Les appels système renvoient 0 s'ils reussissent, ou -1 s'ils échouent, auquel cas errno contient le code d'erreur.

ERREURS

EBADF
    fd n'est pas un descripteur de fichier valide ouvert en écriture.

EIO Une erreur s'est produite pendant la synchronisation.

EROFS, EINVAL
    fd est associé à un type de fichier spécial qui ne permet pas de synchronisation.

CONFORMITÉ
BSD 4.3, POSIX.1-2001.

DISPONIBILITÉ
Sur les systèmes POSIX sur lesquels fdatasync() est disponible, la constante symbolique _POSIX_SYNCHRONIZED_IO est définie dans <unistd.h> comme étant une valeur supérieure à 0. (Voir aussi sysconf(3).)

NOTES
Les applications qui accèdent à des bases de données ou à des fichiers de journalisation n'écrivent souvent qu'une faible quantité de données (par exemple, une ligne dans un fichier de journalisation) et appellent ensuite immédiatement fsync(2) pour s'assurer que les données écrites soient physiquement stockées sur le disque Malheureusement, fsync(2) initiera toujours deux opérations d'écriture : une pour les données nouvellement écrites, et une autre pour mettre à jour la date de modification stockée dans l'i-noeud. Si la date de modification ne fait pas partie du concept de l'opération, fdatasync() peut être utilisé pour éviter des opérations d'écriture inutiles de l'i-noeud sur le disque. Si le disque dur dispose d'un tampon en écriture, les données ne sont peut-être pas enregistrées définitivement lorsque fsync() / fdatasync(2) se termine.

Lorsqu'un système de fichiers ext2 est monté avec l'option sync, les entrées de répertoires sont également synchronisées lors de l'appel à fsync().

Sur les noyaux antérieurs au 2.4, fsync() peut être sensiblement inefficace sur les gros fichiers. Une autre solution peut être l'utilisation de l'attribut O_SYNC lors de l'invocation de open(2). Dans Linux 2.2 et précédents, fdatasync() était équivalent à fsync(2), et n'apportait donc aucun avantage en performance.

VOIR AUSSI
bdflush(2), open(2), sync(2), sync_file_range(2), hdparm(8), mount(8), sync(8), update(8)

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 10 octobre 1996 et révisée le 22 décembre 2007.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 fsync ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.