inotify无法对IN_DELETE做出反应

时间:2011-11-30 23:43:03

标签: 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 ;
}

1 个答案:

答案 0 :(得分:4)

终于弄明白了发生了什么。 Linux或者Gnome实际上并没有删除文件,只是简单地移动文件。即使文件被简单地重命名,它显然也会移动到某处,然后一个带有新名称的新文件从其他地方移动到该文件夹​​中(某个临时文件夹?)。 rm命令实际上删除了一个文件,我的代码将其注册为IN_DELETE事件。删除Gnome中的文件或目录但注册为IN_MOVED_TO,同时将注册表重命名为IN_MOVED_TO,后跟IN_MOVED_FROM

我以为我已经检查过这是第一件事,但显然还不够好。