いくつかのサブディレクトリを含むディレクトリを監視する必要があります。各サブディレクトリには、ファイルの追加、変更、および削除を監視する必要があるファイルがあります。
いくつかのサンプルコードを見つけて、それを機能させるために少し変更する必要がありましたが、必要なことを正確に実行することはできません. ファイルの名前変更、またはディレクトリ内の削除 (サブディレクトリではない) を見つけることができますが、ファイルの変更には応答しません。
Google 検索を使用して見つける方法は、各ファイルを個別に監視することです。ただし、監視するファイルが数十万あり、それぞれにファイル記述子を保持することはおそらく賢明ではありません。
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;
}