私には次の(粗い)関数があります。この関数は、ディレクトリで新しいファイルや削除されているファイルを継続的に監視し、そのような変更を記録します。すべての新しいファイルとディレクトリを正しく記録しますが、削除されたファイルやディレクトリにはまったく反応しないようです。
これread()
は、ファイルが作成されている場合は返されますが、ファイルが削除されている場合は返されない呼び出しのようです。
関数は2つの独立したスレッドの1つとして呼び出されていますが、現在、もう1つのスレッドは何もしません(プレースホルダーとしての空の無限ループのみ)。
void* watchfs(void* arg) {
int infp, watch, length, i ;
char buffer[EVENT_BUF_LEN] ;
struct inotify_event* event ;
if ((infp = inotify_init()) < 0) {
fatal("inotify: Could not initialize") ;
}
watch = inotify_add_watch(infp, userdir, IN_CREATE | IN_DELETE) ;
for (;;) {
length = read(infp, buffer, EVENT_BUF_LEN) ;
if (length < 0) {
fatal("inotify: Could not read events") ;
}
i = 0 ;
while (i < length) {
event = (struct inotify_event*) &buffer[i] ;
if (event->len) {
if (event->mask & IN_CREATE) {
if (event->mask & IN_ISDIR) {
record(LOG_FILESYS, "New directory created") ;
} else {
record(LOG_FILESYS, "New file created") ;
}
} else if (event->mask & IN_DELETE) {
if (event->mask & IN_ISDIR) {
record(LOG_FILESYS, "Directory deleted") ;
} else {
record(LOG_FILESYS, "File deleted") ;
}
}
}
i += EVENT_SIZE + event->len ;
}
}
inotify_rm_watch(infp, watch) ;
close(infp) ;
return 0 ;
}