inotify没有通知我期望它的方式

时间:2012-02-26 19:20:39

标签: c++ inotify

我创建了一个小片段来尝试理解inotify的工作原理。我的测试很简单:我运行代码,然后用任何编辑器打开/ home / qdii / test,修改它并保存文件。什么都没发生。我再次修改文件并保存,并显示“event received”。从那时起,再次修改文件不会再触发任何内容。

我希望inotify每次修改文件时都会发出“收到的事件”。我做错了什么?

#include <errno.h>
#include <sys/inotify.h>
#include <fcntl.h>
#include <assert.h>
#include <unistd.h>
#include <iostream>
int main()
{
    const int fd = inotify_init();
    inotify_add_watch(fd, "/home/qdii/test", IN_MODIFY);

    while (true)
    {
        const size_t buf_size = sizeof(struct inotify_event);
        char buf[buf_size]; 

        if (read(fd, buf, buf_size) >= 0)
            std::cout << "event received" << std::endl;

        sleep(1);
    }

    return 0;
}

1 个答案:

答案 0 :(得分:2)

这是预期的。大多数编辑都不会(总是)就地编辑文件,但会创建临时文件并在保存时播放取消链接/重命名游戏(以免丢失数据)。

由于您没有跟踪文件删除事件,因此您不知道您正在跟踪的文件已经消失。如果要在编辑器保存后继续跟踪新创建的文件(具有相同名称),则需要删除原始监视并重新添加(最好在创建文件时监视触发器)你在工作。)

其他评论:那里的sleep既不必要又适得其反。 read正在阻塞,所以当没有任何事情发生时你不会浪费CPU,而睡眠会增加你错过事件的机会。