C программа, использующая inotify для мониторинга нескольких каталогов наряду с подкаталогами? - PullRequest
2 голосов
/ 19 января 2010

У меня есть программа, которая контролирует каталог (/ test) и уведомляет меня.Я хочу улучшить это, чтобы отслеживать другой каталог (скажем, / opt).А также, как отслеживать его подкаталоги, в настоящее время я получу уведомление, если будут внесены какие-либо изменения в файлы в / test.но я не получаю никаких указаний, если внесены изменения в подкаталог / test, то есть touch /test/sub-dir/files.txt ..

Вот мой текущий код - надеюсь, это поможет*

/*

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;
        }

    }

}

Ответы [ 3 ]

4 голосов
/ 03 сентября 2012

inotify_add_watch не прослушивает изменения в подкаталогах. Вы должны определить, когда создаются эти подкаталоги, а также inotify_add_watch их.

Самое важное, на что следует обратить внимание, - это то, что после создания подкаталога вы будете уведомлены соответствующим образом, но в тот момент, когда вы получите это уведомление, файлы и подкаталоги, возможно, уже были созданы внутри него, поэтому потеряет эти события, так как у вас еще не было возможности добавить часы для нового подкаталога.

Одним из способов избежать этой проблемы является сканирование содержимого каталога после получения уведомления, чтобы вы могли увидеть, что на самом деле там. Это создает возможность для добавления дополнительных часов для них.

0 голосов
/ 20 января 2012

вы можете попытаться удалить подпапку, а затем создавать ее заново каждый раз, когда вам нужно что-то добавить в нее.

0 голосов
/ 18 января 2012

В inotify вам нужно по одному часу на каталог. Для глобальных уведомлений есть fanotify или около того.

...