我正在用;inotify
编写的程序中使用C
它与 中的示例非常相似man 7 inotify
。步骤基本上是:
/* setup */
int fd = inotify_init1(IN_NONBLOCK);
int wd = inotify_add_watch(fd, path, IN_CLOSE_WRITE);
struct pollfd fds[1];
fds[0].fd = fd;
fds[0].events = POLLIN;
/* within main loop */
int poll_num = poll(fds, 1, 0);
if (poll_num == -1) { /* error handling */ }
else if (poll_num>0) {
if (fds[0].revents & POLLERR ||
fds[0].revents & POLLHUP ||
fds[0].revents & POLLNVAL) { /* error handling */ }
if (fds[0].revents & POLLIN) { /* read events */ }
}
读取事件时,会检查事件掩码是否存在队列溢出 ( IN_Q_OVERFLOW
)、文件系统卸载 ( IN_UNMOUNT
) 和其他问题 ( IN_IGNORED
)。这些情况(以及POLLERR
、POLLHUP
等)都不会发生。
这在一段时间内效果很好(通常运行一两天)。然后,无缘无故地inotify
停止报告事件。我的程序的其余部分继续运行,没有任何问题,但它不再收到任何事件,inotify.
我不确定如何调试它,因为我相信我正在检查所有相关的错误条件。被监视的文件仍然存在,并且具有与inotify
设置监视它时相同的 inode。
什么会导致inotify
停止报告事件而不在程序中产生任何错误?