我创建了一个小片段来尝试理解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;
}
答案 0 :(得分:2)
这是预期的。大多数编辑都不会(总是)就地编辑文件,但会创建临时文件并在保存时播放取消链接/重命名游戏(以免丢失数据)。
由于您没有跟踪文件删除事件,因此您不知道您正在跟踪的文件已经消失。如果要在编辑器保存后继续跟踪新创建的文件(具有相同名称),则需要删除原始监视并重新添加(最好在创建文件时监视触发器)你在工作。)
其他评论:那里的sleep
既不必要又适得其反。 read
正在阻塞,所以当没有任何事情发生时你不会浪费CPU,而睡眠会增加你错过事件的机会。