我需要监视一个包含多个子目录的目录,每个子目录都有我需要监视的文件以进行文件添加、修改和删除。
我找到了一些示例代码,并且不得不稍微修改它以使其正常工作,但它并不能完全满足我的需要。它可以在目录(但不是子目录)中找到文件重命名或删除,但不响应文件修改。
我可以使用谷歌搜索找到的方法是单独监控每个文件;但是,我有数十万个文件要监视,并且为每个文件保留一个文件描述符可能是不明智的。
在 FreeBSD 下有没有办法做我需要做的事情?还是我必须找到替代解决方案?
#include <sys/types.h>
#include <sys/event.h>
#include <sys/time.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int f, kq, nev;
struct kevent change;
struct kevent event;
kq = kqueue();
if (kq == -1)
perror("kqueue");
f = open("/tmp/foo", O_RDONLY);
if (f == -1)
perror("open");
EV_SET(&change, f, EVFILT_VNODE,
EV_ADD | EV_ENABLE | EV_ONESHOT,
NOTE_DELETE | NOTE_EXTEND | NOTE_WRITE | NOTE_ATTRIB,
0, 0);
for (;;) {
nev = kevent(kq, &change, 1, &event, 1, NULL);
if (nev == -1)
perror("kevent");
else if (nev > 0) {
if (event.fflags & NOTE_DELETE) {
printf("File deleted\n");
break;
}
if (event.fflags & NOTE_EXTEND ||
event.fflags & NOTE_WRITE)
printf("File modified\n");
if (event.fflags & NOTE_ATTRIB)
printf("File attributes modified\n");
}
}
close(kq);
close(f);
return EXIT_SUCCESS;
}