2010-01-19 5 views
2

J'ai un programme qui surveille un répertoire (/ test) et m'en informe. Je veux améliorer cela pour surveiller un autre répertoire (disons/opt). Et aussi comment surveiller ses sous-répertoires, en cours je serai averti si des modifications ont été apportées aux fichiers sous/test. mais je ne reçois aucune inotifcation si les modifications apportées sous-répertoire/test, qui est tactile /test/sub-dir/files.txt ..C programme en utilisant inotify pour surveiller plusieurs répertoires avec des sous-répertoires?

Voici mon code actuel - espérons que cela aidera

/* 

Simple example for inotify in Linux. 

inotify has 3 main functions. 
inotify_init1 to initialize 
inotify_add_watch to add monitor 
then inotify_??_watch to rm monitor.you the what to replace with ??. 
yes third one is inotify_rm_watch() 
*/ 


#include <sys/inotify.h> 

int main(){ 
    int fd,wd,wd1,i=0,len=0; 
    char pathname[100],buf[1024]; 
    struct inotify_event *event; 

    fd=inotify_init1(IN_NONBLOCK); 
    /* watch /test directory for any activity and report it back to me */ 
    wd=inotify_add_watch(fd,"/test",IN_ALL_EVENTS); 

    while(1){ 
     //read 1024 bytes of events from fd into buf 
     i=0; 
     len=read(fd,buf,1024); 
     while(i<len){ 
      event=(struct inotify_event *) &buf[i]; 


      /* check for changes */ 
      if(event->mask & IN_OPEN) 
       printf("%s :was opened\n",event->name); 

      if(event->mask & IN_MODIFY) 
       printf("%s : modified\n",event->name); 

      if(event->mask & IN_ATTRIB) 
       printf("%s :meta data changed\n",event->name); 

      if(event->mask & IN_ACCESS) 
       printf("%s :was read\n",event->name); 

      if(event->mask & IN_CLOSE_WRITE) 
       printf("%s :file opened for writing was closed\n",event->name); 

      if(event->mask & IN_CLOSE_NOWRITE) 
       printf("%s :file opened not for writing was closed\n",event->name); 

      if(event->mask & IN_DELETE_SELF) 
       printf("%s :deleted\n",event->name); 

      if(event->mask & IN_DELETE) 
       printf("%s :deleted\n",event->name); 

      /* update index to start of next event */ 
      i+=sizeof(struct inotify_event)+event->len; 
     } 

    } 

} 

Répondre

0

Dans inotify, vous avez besoin d'une montre par répertoire. Pour les notifications globales, il y a fanotify ou plus.

0

vous pouvez essayer de supprimer le sous-dossier et de le recréer chaque fois que vous avez besoin d'ajouter quelque chose dedans.

4

inotify_add_watch n'écoute pas les modifications dans les sous-répertoires. Vous devez détecter quand ces sous-répertoires sont créés, et aussi inotify_add_watch eux. La chose la plus importante à noter est qu'après la création d'un sous-répertoire, vous serez averti en conséquence, mais au moment où vous recevez cette notification, des fichiers et des sous-répertoires peuvent déjà avoir été créés à l'intérieur de celui-ci. vous "perdrez" ces événements, puisque vous n'avez pas encore pu ajouter une montre pour le nouveau sous-répertoire. Une manière d'éviter ce problème consiste à analyser le contenu du répertoire après avoir reçu la notification, afin que vous puissiez voir ce qui s'y trouve réellement. Cela crée une opportunité pour ajouter d'autres montres pour eux.

Questions connexes