C/C+ écouter un fichier qui change, cpp surveiller les modifications d'un fichier (sous Linux)

Forum des professionnels en informatique > C et C++ > C > Recharger cette page Surveiller l'évolution d'un fichier

inotify_init
ajout des fichiers à surveiller avec inotify_add_watch
select pour remonter les événements

inotify est un mécanisme du noyau Linux qui fournit des notifications concernant le système de fichiers.

Pour les utilisateurs de PHP vous trouverez la surveillance/notifications de fichiers dans les Fonctions Inotify


NOM

      inotify_add_watch - Ajouter une surveillance à une instance inotify déjà initialisée

SYNOPSIS

      #include <sys/inotify.h>
      int inotify_add_watch(int fd, const char *pathname, uint32_t mask);

DESCRIPTION

      inotify_add_watch() ajoute un surveillant, ou en modifie un existant, sur le fichier dont le chemin est fournit dans pathname ; l'appelant doit
      avoir la permission de lecture sur ce fichier. L'argument fd est un descripteur de fichier référençant l'instance  inotify  dont  la  liste  de
      surveillance  doit  être modifiée. Les événements à surveiller sur pathname sont spécifiés dans l'argument masque de bits mask. Voir inotify(7)
      pour une description des bits qui peuvent être positionnés dans mask.
      Un appel réussi à inotify_add_watch() renvoie un descripteur de surveillance unique, associé avec pathname, pour  cette  instance  inotify.  Si
      pathname  n'était pas déjà surveillé par cette instance inotify, le descripteur de surveillance est alloué par le noyau. Si pathname était déjà
      surveillé, le descripteur de la surveillance existante est renvoyé.
      Le descripteur de surveillance est renvoyé par des appels ultérieurs à read(2) sur le descripteur de fichier inotify.  Ces  lectures  renvoient
      des  structures  inotify_event  (voir inotify(7)) indiquant des événements sur le système de fichiers ; le descripteur de surveillance de cette
      structure identifie l'objet pour lequel cet événement a eu lieu.

VOIR AUSSI

      inotify_init(2), inotify_rm_watch(2), inotify(7)

NOM

      inotify_init - Initialiser une instance inotify

SYNOPSIS

      #include <sys/inotify.h>
      int inotify_init(void);

DESCRIPTION

      inotify_init()  initialise une nouvelle instance inotify et renvoie un descripteur de fichier associé à une nouvelle file d'événements inotify.

VOIR AUSSI

      inotify_add_watch(2), inotify_rm_watch(2), inotify(7)

NOM

      inotify_rm_watch - Supprime une surveillance existante d'une instance inotify

SYNOPSIS

      #include <sys/inotify.h>
      int inotify_rm_watch(int fd, uint32_t wd);

DESCRIPTION

      inotify_rm_watch() supprime la surveillance associée au descripteur wd de l'instance inotify associée au descripteur de fichier fd.
      La suppression d'une surveillance provoque la génération d'un événement IN_IGNORED pour le descripteur. Voir inotify(7).

VOIR AUSSI

      inotify_add_watch(2), inotify_init(2), inotify(7)

NOM

      inotify - Contrôler les événements des systèmes de fichiers

DESCRIPTION

      L'API  inotify  fournit un mécanisme pour contrôler les événements au niveau des systèmes de fichiers. Inotify peut être utilisé pour contrôler
      des fichiers individuels ou des répertoires. Quand un répertoire est contrôlé, 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 API : inotify_init(2), inotify_add_watch(2), inotify_rm_watch(2), read(2) et close(2).
      inotify_init(2) crée une instance inotify et renvoie un descripteur de fichier se référant à cette instance inotify.
      inotify_add_watch(2)  manipule la « liste de surveillance » associée à une instance inotify. Chaque élément (« watch ») de la liste de surveil-
      lance spécifie le chemin d'un fichier ou d'un répertoire, avec un ensemble d'événements que le noyau doit contrôler 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éé.
      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, 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.
      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 ; voir 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 d'élément 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 fichier 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 (voyez 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_MOVE_FROM et IN_MOVE_TO en résultant d'être associés par l'application.
      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 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(ino-
      tify_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.
  É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 bits de masquage 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 via le champ mask retourné par read(2) :
          IN_ACCESS         Accès au fichier (lecture) (*).
          IN_ATTRIB         Modification  des métadonnées, par exemple, les permissions, les horodatages, les attributs étendus, le compteur de liens
                            (depuis Linux 2.6.25), UID, GID, etc. (*).
          IN_CLOSE_WRITE    Fichier ouvert en écriture fermé (*).
          IN_CLOSE_NOWRITE  Fichier non ouvert en écriture fermé (*).
          IN_CREATE         Fichier/rép. créé dans le répertoire surveillé (*).
          IN_DELETE         Fichier/répertoire supprimé dans le répertoire surveillé (*).
          IN_DELETE_SELF    Fichier/répertoire surveillé supprimé.
          IN_MODIFY         Fichier modifié (*).
          IN_MOVE_SELF      Fichier/répertoire surveillé déplacé.
          IN_MOVED_FROM     Fichier déplacé hors du répertoire surveillé (*).
          IN_MOVED_TO       Fichier déplacé dans le répertoire surveillé (*).
          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éper-
      toire, 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 bit de masquage 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   sont   disponibles :   IN_MOVE,   équivalent   à   IN_MOVED_FROM|IN_MOVED_TO,   et   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_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é)
          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é.

VOIR AUSSI

      inotify_add_watch(2), inotify_init(2), inotify_rm_watch(2), read(2), stat(2), Documentation/filesystems/inotify.txt.

NOM

      select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - Multiplexage d'entrées-sorties synchrones.

SYNOPSIS

      /* D'après POSIX.1-2001 */
      #include <sys/select.h>
      /* D'après les standards précédents */
      #include <sys/time.h>
      #include <sys/types.h>
      #include <unistd.h>
      int select(int nfds, fd_set *readfds, fd_set *writefds,
       fd_set *exceptfds, struct timeval *timeout);
      void FD_CLR(int fd, fd_set *set);
      int FD_ISSET(int fd, fd_set *set);
      void FD_SET(int fd, fd_set *set);
      void FD_ZERO(fd_set *set);
      #include <sys/select.h>
      int pselect(int nfds, fd_set *readfds, fd_set *writefds,
       fd_set *exceptfds, const struct timespec *timeout,
       const sigset_t *sigmask);
  Exigences de macros de test de fonctionnalités pour la glibc (voir feature_test_macros(7)) :
      pselect() : _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >=600

DESCRIPTION

      select()  et pselect() permettent à un programme de surveiller plusieurs descripteurs de fichier, en attendant qu'au moins l'un de ces descrip-
      teurs soit « prêt » pour une certaine classe d'opérations d'entrée-sortie. Un descripteur de fichier est considéré comme prêt s'il est possible
      d'effectuer l'opération correspondante (par exemple read(2)) sans bloquer.

VOIR AUSSI

      Pour un tutoriel avec des exemples, voir select_tut(2).
      D'autres pages ayant un vague rapport : accept(2), connect(2), poll(2), read(2), recv(2), send(2), sigprocmask(2), write(2), epoll(7), time(7)

NOM

      read - Lire le contenu d'un fichier.

SYNOPSIS

      #include <sys/types.h>
      #include <unistd.h>
      ssize_t read(int fd, void *buf, size_t count);

DESCRIPTION

      read lit jusqu'à count octets depuis le descripteur de fichier fd dans le buffer pointé par buf.
      Si count vaut zéro, read renvoie zéro et n'a pas d'autres effets. Si count est supérieur à SSIZE_MAX, le résultat est indéfini.

VALEUR RENVOYÉE

      read renvoie -1 s'il échoue, auquel cas errno contient le code d'erreur, et la position de la tête de lecture est indéfinie. Sinon, read renvoie le nombre d'octets lus (0 en fin de fichier), et avance la tête de lecture de ce nombre. Le fait que le nombre renvoyé soit plus petit que le nombre demandé n'est pas une erreur. Ceci se produit à la fin du fichier, ou si on lit depuis un tube ou un terminal, ou encore si read a été interrompu par un signal.

inotify_init

INOTIFY_INIT(2) Manuel du programmeur Linux INOTIFY_INIT(2)

NOM

      inotify_init - Initialiser une instance inotify

SYNOPSIS

      #include <sys/inotify.h>
      int inotify_init(void);

DESCRIPTION

      inotify_init()  initialise une nouvelle instance inotify et renvoie un descripteur de fichier associé à une nouvelle file d'événements inotify.

VALEUR RENVOYÉE

      inotify_init() renvoie un nouveau descripteur de fichier s'il réussit, et -1 en cas d'erreur, auquel cas errno contient le code d'erreur.

ERREURS

      EMFILE La limite du nombre total d'instances inotify par utilisateur a été atteinte.
      ENFILE La limite du nombre total de fichiers ouverts sur le système a été atteinte.
      ENOMEM Pas assez de mémoire pour le noyau.

VERSIONS

      Inotify a été intégré dans Linux 2.6.13.

CONFORMITÉ

      Cet appel système est spécifique à Linux.

VOIR AUSSI

      inotify_add_watch(2), inotify_rm_watch(2), inotify(7)

COLOPHON

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

TRADUCTION

      Cette  page de manuel a été traduite et mise à jour par Christophe Blaess http://www.blaess.fr/christophe/ entre 1996 et 2003, puis par Alain
      Portal <aportal AT univ-montp2 DOT fr> jusqu'en 2006, et mise à disposition sur http://manpagesfr.free.fr/.

Les pages de manuel Linux (man pages) sont la documentation de référence de l'utilisateur du système de type Linux

  • man select - Multiplexage d'entrées/sorties synchrones.
  • man read - Lire le contenu d'un fichier

Rien a voir, juste auditer les modification faites par les utilisateurs sur les fichiers : Linux audit files to see who made changes to a file

Reg Preg PCRE : Les expression régulières en C

#include <regex.h>
 
regex_t preg;
 
const char *str_regex = "/[[:digit:]]{1,}:[[:digit:]]{2}";
 
err = regcomp (&preg, str_regex, REG_EXTENDED);
 
// int regexec (const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
 
match = regexec (&preg, str_request, nmatch, pmatch, 0);
  • .re_nsub
  • .rm_so
  • .rm_eo

Les tableaux en C C++

En vrac

  • Langages › C++
    • Les objets en langage C++ : il existe deux façons de créer des objets, c'est-à-dire d'instancier une classe : statique ou dynamique

Débuger le seg fault : Segmentation fault / Erreur de segmentation

On débug en lançant le programme dans le debugger:

gdb ./leProgrammeDejaCompilé

Avec Eclipse : CDT

Eclipse CDT : Eclipse C/C++ Development Tools.

Avec Eclipse HELIOS : Eclipse CDT (C/C++ Development Tooling)

  • Eclipse CDT P2 Customizations for SDK installation Version: 1.0.0.201102110609
  • Eclipse C/C++ Development Tools Version: 7.0.2.201102110609
  • GDB Common Version: 7.0.0.201102110609

CDT Wiki page

  • Le plug-in CDT pour le développement en C / C++. Le CDT ne fournit pas de compilateur : il est nécessaire d'utiliser un compilateur externe. Le seul compilateur actuellement supporté par le CDT est le célèbre compilateur GCC du projet GNU. D'autres outils du projet GNU sont aussi nécessaires tel que make ou GDB (GNU Debugger). Sous Windows, il vous faudra Cygwin ou MinGW (Minimalist GNU for Windows : un projet open source qui a pour but de fournir un ensemble de fichier en-tête et de bibliothèques pour générer des exécutables natifs sous Windows en utilisant des outils du projet GNU.).

Ensuite, retrouvez vos compliateurs :

C:\MinGW\bin>g++
g++: no input files

g++

man g++

gcc - GNU project C and C++ compiler Synopsis

gcc [-c|-S|-E] [-std=standard] [-g] [-pg] [-Olevel] [-Wwarn...] [-pedantic] [-Idir...] [-Ldir...] [-Dmacro[=defn]...] [-Umacro] [-foption...] [-mmachine-option...] [-o outfile] infile...

Only the most useful options are listed here; see below for the remainder. g++ accepts mostly the same options as gcc.

-l library

   Search the library named library when linking. (The second alternative with the library as a separate argument is only for POSIX compliance and is not recommended.)

The directories searched include several standard system directories plus any that you specify with -L.

-Ldir

   Add directory dir to the list of directories to be searched for -l.

http://ftp.gnome.org/pub/gnome/bina...

Since December 2006 I will do my Win32 builds of GNOME software against an own build of the regex part from a fresh glibc, that provides a DLL called libgnurx-0.dll. I package this as "libgnurx" (a name I just came up with myself). This should hopefully avoid any confusion.

undefined reference to `regcomp'

gcc

GCC, the GNU Compiler Collection The GNU Compiler Collection includes front ends for C, C, Objective-C, Fortran, Java, Ada, and Go, as well as libraries for these languages (libstdc, libgcj,...).

  • GNU Compiler Collection, le principal compilateur de langage C et C++ libre. Pour faire référence précisément aux compilateurs de chaque langage, on parle de :
    • gcc pour C ;
    • G pour [C|http://fr.wikipedia.org/wiki/C%2B%2B] ;
    • GNU Debugger (gdb)
  • Mode d'emploi de GCC