inotify 无法对 IN_DELETE 做出反应

4 c inotify

我有以下(粗略)功能,它不断监视目录中的新文件和被删除的文件,记录此类更改。它正确记录所有新文件和目录,但似乎对删除的文件或目录没有任何反应。

read()删除文件时,该调用似乎不会返回,但创建的文件会返回。

该函数被作为两个独立线程之一调用,尽管目前另一个线程不执行任何操作(只是一个空的无限循环作为占位符)。

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 ;
}
Run Code Online (Sandbox Code Playgroud)

小智 5

终于明白是怎么回事了。Linux,或者也许是 Gnome,实际上并不删除文件,而只是移动它们。即使文件被简单地重命名,它显然会被移动到某个地方,然后具有新名称的新文件也会从其他地方(某个临时文件夹?)移动到该文件夹​​中。该rm命令实际上删除了一个文件,并且我的代码IN_DELETE按预期将其注册为事件。然而,在 Gnome 中删除文件或目录会注册为IN_MOVED_TO,而重命名寄存器则IN_MOVED_TO注册为IN_MOVED_FROM

我以为我已经将其作为首要任务之一进行检查,但显然还不够好。

  • 在 Linux 上,重命名与在同一目录中移动相同。因此,如果我有一个文件“/my/home/file”并重命名为“/my/home/superfile”,它将注册为“moved /my/home/file to /my/home/superfile”。有两个事件,因为您可能有兴趣观看“/my/home/file”或“/my/home/superfile”。移动到事件链接到“文件”,移动自事件链接到“超级文件”。如果您只有移动到事件,那么观看“超级文件”的程序将不会收到事件。 (2认同)