我有一个监视目录(/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条答案
按热度按时间7d7tgy0s1#
inotify_add_watch
不侦听子目录中的更改。您必须检测这些子目录是何时创建的,并对它们进行inotify_add_watch
。需要注意的最重要的一点是,在创建子目录后,您将收到相应的通知,但在您收到通知时,文件和子目录可能已经在该子目录中创建,因此您将“丢失”这些事件,因为您还没有机会为新的子目录添加监视。
避免此问题的一种方法是在收到通知后扫描目录内容,以便您可以看到目录中真正的内容。这为他们增加更多的手表创造了机会。
yduiuuwa2#
在inotify中,每个目录需要一个监视。对于全局通知,有fanotify或左右。
yuvru6vn3#
你可以尝试删除子文件夹,然后在每次需要添加内容时重新创建它。