bionic (7) inotify.7.gz

Provided by: manpages-fr_3.65d1p1-1_all bug

NOM

       inotify - Surveiller les événements des systèmes de fichiers

DESCRIPTION

       L'API  inotify  fournit  un  mécanisme pour surveiller les événements au niveau des systèmes de fichiers.
       Inotify peut être utilisé  pour  surveiller  des  fichiers  individuels  ou  des  répertoires.  Quand  un
       répertoire  est  surveillé,  inotify  va  signaler des événements pour le répertoire lui-même et pour les
       fichiers de ce répertoire.

       Les appels système suivants sont utilisés avec cette interface de programmation :

       -  inotify_init(2) crée une instance inotify et renvoie un descripteur de fichier  se  référant  à  cette
          instance  inotify.  L'appel  système plus récent inotify_init1(2) est comme inotify_init(2), mais a un
          argument flags qui fournit un accès à des fonctionnalités supplémentaires.

       -  inotify_add_watch(2) manipule la « liste de surveillance » associée à  une  instance  inotify.  Chaque
          élément  (« watch »)  de  la  liste de surveillance indique le chemin d'un fichier ou d'un répertoire,
          avec un ensemble d'événements que le noyau doit surveiller pour le  fichier  indiqué  par  ce  chemin.
          inotify_add_watch(2)  crée  un  nouvel  élément de surveillance ou modifie un élément existant. Chaque
          élément a un unique « descripteur  de  surveillance »,  un  entier  renvoyé  par  inotify_add_watch(2)
          lorsque cet élément est créé.

       -  Quand  les événements ont lieu pour des fichiers et répertoires surveillés, ces événements sont rendus
          disponibles à l’application comme des données structurées qui peuvent être lues depuis le  descripteur
          de fichier inotify en utilisant read(2) (voir plus bas).

       -  inotify_rm_watch(2) retire un élément d'une liste de surveillance inotify.

       -  Quand tous les descripteurs de fichier se référant à une instance inotify ont été fermés (en utilisant
          close(2)), l'objet sous-jacent et ses ressources sont libérés pour être réutilisés par le noyau ; tous
          les éléments de surveillance associés sont automatiquement libérés.

          Avec  une  programmation  prudente, une application peut utiliser inotify pour surveiller et mettre en
          cache efficacement l’état d’un ensemble d’objets de système de fichiers. Cependant,  les  applications
          robustes  devraient prendre en compte que des bogues dans la logique de surveillance ou des situations
          de compétition du type décrit ci-dessous pourraient laisser le cache incohérent avec l’état du système
          de  fichiers.  Réaliser  des  vérifications  de cohérence et reconstruire le cache en cas de détection
          d’incohérences serait sans doute sage.

   Lecture d’événements d’un descripteur de fichier inotify
       Pour déterminer quels événements ont eu lieu, une application va lire  avec  read(2)  le  descripteur  de
       fichier  inotify.  Si aucun événement n'a eu lieu, alors, en supposant qu'il s'agisse d'un descripteur de
       fichier bloquant, read(2) se bloquera jusqu'à ce qu'au moins un événement ait lieu (à  moins  qu'elle  ne
       soit interrompue par un signal, auquel cas l'appel échouera avec l'erreur EINTR ; consultez signal(7)).

       Chaque  lecture  (avec  read(2))  réussie  renvoie  un  tampon  contenant une ou plusieurs des structures
       suivantes :

           struct inotify_event {
               int      wd;       /* Descripteur de surveillance */
               uint32_t mask;     /* Masque d'événements */
               uint32_t cookie;   /* Cookie unique d'association des
                                     événements (pour rename(2)) */
               uint32_t len;      /* Taille du champ name */
               char     name[];   /* Nom optionnel terminé par un nul */
           };

       wd identifie l'élément de surveillance  pour  lequel  cet  événement  a  lieu.  Il  s'agit  de  l'un  des
       descripteurs de surveillance renvoyés par un précédent appel à inotify_add_watch(2).

       mask contient des bits qui décrivent l'événement qui a eu lieu (voir ci-dessous).

       cookie  est  un  entier  unique  qui  relie  les  événements.  Ce n'est actuellement utilisé que pour les
       événements de renommage, et permet à la paire d'événements  IN_MOVED_FROM  et  IN_MOVED_TO  en  résultant
       d'être associés par l'application. Pour tous les autres types d'événements, cookie est mis à 0.

       Le  champ  name n'est présent que lorsqu'un événement est renvoyé pour un fichier au sein d'un répertoire
       surveillé. Il identifie le chemin du fichier par rapport au répertoire surveillé. Ce chemin  est  terminé
       par  un caractère nul et peut inclure d'autres octets nuls (« \0 ») pour ajuster des lectures successives
       à une limite d'adressage convenable.

       Le champ len compte tous les octets de  name,  incluant  les  caractères  nuls.  La  longueur  de  chaque
       structure inotify_event vaut donc sizeof(structinotify_event)+len.

       Le  comportement  lorsque  le  tampon  donné  à read(2) est trop petit pour renvoyer l'information sur le
       prochain événement dépend de  la  version  du  noyau :  avant  2.6.21,  read(2)  renvoie  0 ;  depuis  le
       noyau 2.6.21, read(2) échoue avec l'erreur EINVAL. Indiquer un tampon de taille

           sizeof(struct inotify_event) + NAME_MAX + 1

       est suffisant pour lire au moins un événement.

   Événements inotify
       L'argument mask passé à inotify_add_watch(2) et le champ mask de la structure inotify_event renvoyés lors
       de la lecture avec read(2) d'un descripteur de fichier  inotify  sont  tous  deux  des  masques  binaires
       identifiant  les  événements inotify. Les bits suivants peuvent être définis dans l'argument mask lors de
       l'appel à inotify_add_watch(2) et peuvent être renvoyés dans le champ mask renvoyé par read(2) :

           IN_ACCESS (*)
                  Accès au fichier (par exemple read(2), execve(2)).

           IN_ATTRIB (*)
                  Modification des métadonnées,  par  exemple,  les  permissions  (par  exemple  chmod(2)),  les
                  horodatages  (par  exemple  utimensat(2)), les attributs étendus (setxattr(2)), le compteur de
                  liens (depuis Linux 2.6.25 ; par exemple pour la cible de link(2) et unlink(2)) et les UID  ou
                  GID (par exemple chown(2)).

           IN_CLOSE_WRITE (*)
                  Fichier ouvert en écriture fermé.

           IN_CLOSE_NOWRITE (*)
                  Fichier non ouvert en écriture fermé.

           IN_CREATE (*)
                  Fichier  ou  répertoire  créés  dans  le  répertoire  surveillé  (par exemple open(2) O_CREAT,
                  mkdir(2), link(2), symlink(2), bind(2) sur une socket de domaine UNIX).

           IN_DELETE (*)
                  Fichier ou répertoire supprimés dans le répertoire surveillé.

           IN_DELETE_SELF
                  Fichier ou répertoire surveillés supprimés (cet événement se produit également si un objet est
                  déplacé  vers  un autre système de fichiers, puisque mv(1) copie effectivement le fichier vers
                  l’autre système de fichiers puis le supprime du système de fichiers d’origine).  De  plus,  un
                  événement IN_IGNORED sera ensuite généré pour le descripteur de surveillance.

           IN_MODIFY (*)
                  Fichier modifié (par exemple write(2), truncate(2)).

           IN_MOVE_SELF
                  Fichier ou répertoire surveillés déplacés.

           IN_MOVED_FROM (*)
                  Généré pour le répertoire contenant l'ancien nom quand un fichier est renommé.

           IN_MOVED_TO (*)
                  Généré pour le répertoire contenant le nouveau nom quand un fichier est renommé.

           IN_OPEN (*)
                  Fichier ouvert.

       Lors  de  la surveillance d'un répertoire, les événements marqués par un astérisque (*) ci-dessus peuvent
       avoir lieu pour des fichiers du répertoire, auquel cas le champ  name  dans  la  structure  inotify_event
       renvoyée identifie le nom du fichier dans ce répertoire.

       La  macro  IN_ALL_EVENTS  est  définie  comme un masque binaire de tous les événements décrits ci-dessus.
       Cette macro peut être utilisée comme l'argument mask lors de l'appel à inotify_add_watch(2).

       Deux macros supplémentaires de convenance sont définies :

           IN_MOVE
                  Équivalent à IN_MOVED_FROM | IN_MOVED_TO.

           IN_CLOSE
                  Équivalent à IN_CLOSE_WRITE | IN_CLOSE_NOWRITE.

       Les bits supplémentaires  suivants  peuvent  être  indiqués  dans  l'argument  mask  lors  de  l'appel  à
       inotify_add_watch(2) :

           IN_DONT_FOLLOW (depuis Linux 2.6.15)
                  Ne pas déréférencer pathname s'il s'agit d'un lien symbolique.

           IN_EXCL_UNLINK (depuis Linux 2.6.36)
                  Par  défaut,  lors  de  la  surveillance  d'événements  sur  les  entrées d'un répertoire, des
                  événements sont créés pour ces entrées même après leur suppression du répertoire. De  nombreux
                  événements  inintéressants  pour certaines applications peuvent ainsi être créés (par exemple,
                  lors de la surveillance de /tmp, où de nombreuses applications créent des fichiers temporaires
                  donc  les  noms sont immédiatement supprimés). Indiquer IN_EXCL_UNLINK modifie le comportement
                  par défaut, de telle  sorte  qu'aucun  événement  n'est  créé  pour  ces  entrées  après  leur
                  suppression du répertoire surveillé.

           IN_MASK_ADD
                  Ajouter  les  événements  au masque de surveillance de ce fichier s'il existe déjà (au lieu de
                  remplacer le masque).

           IN_ONESHOT
                  Surveiller pathname jusqu'au premier événement, puis le supprimer de la liste de surveillance

           IN_ONLYDIR (depuis Linux 2.6.15)
                  Ne surveiller pathname que si c'est un répertoire.

       Les bits suivants peuvent avoir été définis dans le champ mask renvoyé par read(2) :

           IN_IGNORED
                  Le surveillant a été retiré explicitement (inotify_rm_watch(2)) ou automatiquement (le fichier
                  a été effacé, ou le système de fichiers a été démonté). Consultez également BOGUES.

           IN_ISDIR
                  Le sujet de cet événement est un répertoire.

           IN_Q_OVERFLOW
                  Queue des événements surchargée (wd vaut alors -1).

           IN_UNMOUNT
                  Le  système  de  fichiers  contenant  l'objet  surveillé  a été démonté. De plus, un événement
                  IN_IGNORED sera ensuite généré pour le descripteur de surveillance.

   Exemples
       Soit une application surveillant le répertoire rép et le fichier rép/monfichier pour tous les événements.
       Les exemples ci-dessous montrent quelques événements qui seront générés pour ces deux objets.

           fd = open("rép/monfichier", O_RDWR);
                  Génère des événements IN_OPEN à la fois pour rép et rép/monfichier.

           read(fd, buf, count);
                  Génère des événements IN_ACCESS à la fois pour rép et rép/monfichier.

           write(fd, buf, count);
                  Génère des événements IN_MODIFY à la fois pour rép et rép/monfichier.

           fchmod(fd, mode);
                  Génère des événements IN_ATTRIB à la fois pour rép et rép/monfichier.

           close(fd);
                  Génère des événements IN_CLOSE_WRITE à la fois pour rép et rép/monfichier.

       Soit  une  application  surveillant  les  répertoires  rép1  et  rép2, et le fichier rép1/monfichier. Les
       exemples suivants montrent quelques événements qui pourraient être générés.

           link("rép1/monfichier", "rép2/nouveau");
                  Génère un événement IN_ATTRIB pour monfichier et un événement IN_CREATE pour rép2.

           rename("rép1/monfichier", "rép2/monfichier");
                  Génère un événement IN_MOVED_FROM  pour  dir1,  un  événement  IN_MOVED_TO  pour  rép2  et  un
                  événement  IN_MOVE_SELF pour monfichier. Les événements IN_MOVED_FROM et IN_MOVED_TO auront la
                  même valeur cookie.

       Soient rép1/xx et rép2/yy les (seuls) liens vers le même ficher, et  une  application  surveillant  rép1,
       rép2,  rép1/xx  et  rép2/yy.  L’exécution  des appels suivants dans l’ordre donné ci-dessous générera les
       événements suivants :

           unlink("rép2/yy");
                  Génère un événement IN_ATTRIB pour xx (à cause du changement de son compteur de liens)  et  un
                  événement IN_DELETE pour rép2.

           unlink("rép1/xx");
                  Génère  des  événements  IN_ATTRIB,  IN_DELETE_SELF  et  IN_IGNORED  pour  xx  et un événement
                  IN_DELETE pour rép1.

       Soit une application surveillant le répertoire rép et le  répertoire  (vide)  rép/sousrép.  Les  exemples
       suivants montrent quelques événements qui pourraient être générés.

           mkdir("rép/nouveau", mode);
                  Génère un événement IN_CREATE | IN_ISDIR pour rép.

           rmdir("rép/sousrép");
                  Génère  des  événements  IN_DELETE_SELF et IN_IGNORED pour sousrép et un événement IN_DELETE |
                  IN_ISDIR pour rép.

   Interfaces /proc
       Les interfaces suivantes peuvent être utilisées pour limiter la quantité de mémoire du noyau utilisée par
       inotify :

       /proc/sys/fs/inotify/max_queued_events
              La valeur dans ce fichier est utilisée lorsqu'une application appelle inotify_init(2) pour définir
              la limite maximale du nombre  des  événements  qui  peuvent  entrer  dans  la  file  d'attente  de
              l'instance  inotify  correspondante.  Les événements au-delà de cette limite sont annulés, mais un
              événement IN_Q_OVERFLOW est systématiquement généré.

       /proc/sys/fs/inotify/max_user_instances
              Cela indique la limite maximale  du  nombre  d'instances  inotify  qui  peuvent  être  créées  par
              identifiant utilisateur réel.

       /proc/sys/fs/inotify/max_user_watches
              Cela  indique  la limite maximale du nombre de « watches » qui peuvent être créées par identifiant
              utilisateur réel.

VERSIONS

       Inotify a été inclus dans le noyau Linux 2.6.13. Les interfaces bibliothèque nécessaires ont été ajoutées
       dans  la  version 2.4  de  glibc  (IN_DONT_FOLLOW,  IN_MASK_ADD  et  IN_ONLYDIR  ont été ajoutées dans la
       version 2.5 de glibc).

CONFORMITÉ

       L’interface de programmation inotify est spécifique à Linux.

NOTES

       Les descripteurs de fichier inotify peuvent être surveillés en utilisant select(2), poll(2) et  epoll(7).
       Lorsqu'un événement est disponible, le descripteur de fichier indique qu'il est accessible en lecture.

       Depuis  Linux 2.6.25,  il  est  possible  d'être  notifié  par  des  signaux pour des entrées-sorties des
       descripteurs de fichier inotify ; consultez la discussion de F_SETFL (pour la configuration de l'attribut
       O_ASYNC), F_SETOWN, et F_SETSIG dans fcntl(2). La structure siginfo_t (décrite dans sigaction(2)) qui est
       passée au gestionnaire de signal a les champs suivants définis : si_fd  est  défini  avec  le  numéro  de
       descripteur  de fichiers inotify ; si_signo est défini avec le numéro du signal ; si_code est défini avec
       POLL_IN ; et si_band est défini avec POLLIN.

       Si deux événements inotify de sortie successifs produits sur  le  descripteur  de  fichier  inotify  sont
       identiques  (wd,  mask,  cookie,  et  name  identiques), alors ils sont fusionnés en un seul événement si
       l'événement le plus ancien n'a toujours pas été lu (mais consultez la section  BOGUES).  Cela  permet  de
       réduire la quantité de mémoire en espace noyau nécessaire à la file d'événements, mais signifie également
       qu'une application ne peut utiliser inotify pour compter de manière  fiable  les  événements  liés  à  un
       fichier.

       Les événements renvoyés lors de la lecture d'un descripteur de fichier inotify forment une file ordonnée.
       Ainsi, par exemple, il est garanti que lors du renommage d'un répertoire, les événements seront  produits
       dans l'ordre convenable sur le descripteur de fichier inotify.

       L'ioctl(2)  FIONREAD  renvoie  le nombre d'octets disponibles pour la lecture d'un descripteur de fichier
       inotify.

   Limites et réserves
       L'interface inotify ne fournit aucun renseignement sur l'utilisateur ou  le  processus  qui  a  déclenché
       l'événement  inotify.  En  particulier,  un  processus  en  train  de  surveiller des événements à l'aide
       d'inotify ne dispose d'aucun moyen facile pour distinguer les événements qu'il déclenche lui-même de ceux
       qui ont été déclenchés par d'autres processus.

       Inotify  ne  signale  que les événements déclenchés par un programme en espace utilisateur à l’aide d’une
       interface de programmation de système de fichiers. Par conséquent, elle n’intercepte pas  les  événements
       qui  surviennent  sur  les  systèmes  de  fichiers en réseau (les applications doivent avoir recours à la
       scrutation (polling) pour intercepter ce type d’événements). De plus, divers pseudosystèmes  de  fichiers
       comme /proc, /sys et /dev/pts ne sont pas surveillables avec inotify.

       L'interface  inotify  ne  signale pas les accès ni les modifications de fichier qui pourraient survenir à
       cause de mmap(2) ou msync(2).

       L'interface inotify identifie les fichiers affectés par leur nom. Cependant, au moment  où  l'application
       traite un événement inotify, ce nom de fichier peut avoir déjà été supprimé ou renommé.

       L’interface  inotify identifie les événements à l’aide de descripteurs de surveillance. L’application est
       responsable de mettre en cache une correspondance (si nécessaire) entre les descripteurs  de  fichier  et
       les  chemins.  Soyez  vigilants aux renommages de répertoire qui pourraient affecter plusieurs chemins en
       cache.

       La surveillance inotify des répertoires n'est pas récursive : pour surveiller les  sous-répertoires,  des
       éléments  de  surveillance  supplémentaires  doivent  être  créés.  Cela  peut  être  assez long pour les
       répertoires contenant une grande arborescence.

       Si la surveillance concerne une arborescence dans son intégralité, et si un nouveau  sous-répertoire  est
       créé dans ce répertoire ou si un répertoire existant est renommé dans cette arborescence, soyez conscient
       qu'au moment où vous créez un élément de  surveillance  pour  le  nouveau  sous-répertoire,  de  nouveaux
       fichiers (et sous-répertoires) peuvent déjà exister dans le sous-répertoire. Ainsi, vous devriez analyser
       le contenu du sous-répertoire  immédiatement  après  avoir  ajouté  l'élément  de  surveillance  (et,  si
       nécessaire, ajouter des éléments de surveillance pour tous les sous-répertoires qu’il contient).

       Remarquez  que  la  file  d'événements  peut  déborder.  Dans  ce  cas,  des  événements sont perdus. Les
       applications robustes devraient gérer correctement la possibilité de perdre des événements. Par  exemple,
       la  reconstruction  de  tout  ou  partie du cache de l’application pourrait être nécessaire (une approche
       simple, mais éventuellement coûteuse, est de fermer le descripteur de fichier inotify,  vider  le  cache,
       créer un nouveau descripteur de fichier inotify et recréer les éléments de surveillance et les entrées du
       cache pour les objets à surveiller).

   Traitement des événements rename()
       Comme noté précédemment, la paire d’événements IN_MOVED_FROM et IN_MOVED_TO générés  par  rename(2)  peut
       être  assemblée  à  l’aide  de  la  valeur de cookie partagé. Cependant, la tâche d’assemblage peut poser
       quelques problèmes.

       Ces deux événements sont normalement consécutifs dans le flux d’événements disponibles lors de la lecture
       depuis  le  descripteur  de  fichiers  inotify.  Cependant,  ce n’est pas garanti. Si plusieurs processus
       déclenchent des événements pour des objets surveillés, alors (rarement)  un  nombre  arbitraire  d’autres
       événements pourrait apparaître entre les événements IN_MOVED_FROM et IN_MOVED_TO.

       L’assemblage  de  la  paire  d’événements  IN_MOVED_FROM  et  IN_MOVED_TO générés par rename(2) pose donc
       intrinsèquement un risque de situation de compétition (n’oubliez pas que  si  un  objet  est  renommé  en
       dehors  d’un  répertoire  surveillé,  un  événement  IN_MOVED_TO  pourrait  ne même pas être envoyé). Des
       approches heuristiques (par exemple supposer que les événements  sont  toujours  consécutifs)  permettent
       d’assurer  un  assemblage  dans  la  plupart  des  cas,  mais  manqueront forcément certains cas, forçant
       l’application à percevoir  les  événements  IN_MOVED_FROM  et  IN_MOVED_TO  comme  indépendants.  Si  les
       descripteurs  de  surveillance  sont  détruits  et  recréés  par  conséquent,  alors  ces descripteurs de
       surveillance seront incohérents avec les descripteurs de surveillance dans tous les événements en attente
       (la  recréation  du descripteur de fichier inotify et la reconstruction du cache pourrait être utile dans
       ce cas).

       Les applications devraient aussi considérer la possibilité que l’événement IN_MOVED_FROM soit le  dernier
       événement  ayant  pu  entrer  dans  le  tampon  renvoyé  pour  l’appel  actuel  de read(2) et l’événement
       IN_MOVED_TO accompagnant pourrait n’être récupéré que lors de l’appel read(2) suivant.

BOGUES

       Dans les noyaux antérieurs à 2.6.16, l'attribut IN_ONESHOT de mask ne fonctionne pas.

       Tel que conçu et implémenté à l’origine,  l’attribut  IN_ONESHOT  ne  forçait  pas  à  générer  un  appel
       IN_IGNORED  lorsque  la  surveillance  était  supprimée  après  un  événement.  Cependant, en conséquence
       involontaire d’autres modifications, depuis Linux 2.6.36, un événement IN_IGNORED est généré dans ce cas.

       Avant  le  noyau 2.6.25,  le  code  du  noyau  qui  était  sensé  regrouper  deux  événements  successifs
       (c'est-à-dire  que  les  deux  événements les plus récents pouvaient être fusionnés si le plus ancien des
       deux n'avait toujours pas été lu) vérifiait à la  place  si  l'événement  le  plus  récent  pouvait  être
       fusionné à l'événement non lu le plus ancien.

VOIR AUSSI

       inotifywait(1),     inotifywatch(1),     inotify_add_watch(2),     inotify_init(2),     inotify_init1(2),
       inotify_rm_watch(2), read(2), stat(2)

       Documentation/filesystems/inotify.txt dans les sources du noyau Linux

COLOPHON

       Cette page fait partie de la publication 3.65 du projet man-pages Linux. Une description du projet et des
       instructions     pour     signaler     des     anomalies    peuvent    être    trouvées    à    l'adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par
       l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

       Christophe       Blaess       <http://www.blaess.fr/christophe/>      (1996-2003),      Alain      Portal
       <http://manpagesfr.free.fr/> (2003-2006).  Julien  Cristau  et  l'équipe  francophone  de  traduction  de
       Debian (2006-2009).

       Veuillez  signaler  toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org> ou par
       un rapport de bogue sur le paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C
       <section> <page_de_man> ».