inotify 检测新文件写入而不会丢失 write_close 事件

inotify 检测新文件写入而不会丢失 write_close 事件

我想观看进程在目录中创建和写入的文件。我无权访问inotifywait工具,因此我仅使用 inotify 库调用。我首先IN_CREATE监视文件是否已创建。如果创建了感兴趣的文件,那么我将添加一个CLOSE_WRITE要监视的事件。这种方案是有效的,除非在我的处理程序处理事件时文件已经被写入并关闭IN_CREATE,并且我错过了该写入事件。

解决这种情况的最佳方法是什么?我正在考虑使用该stat函数来使用atim, mtim,但不确定这是否有任何问题。例如,我打算检查当前时间戳是否大于 st_ctim,以及 st_ctim 是否大于 st_atim。这两个条件表明文件状态在当前时间之前发生了更改(访问和更改)。

答案1

首先,我不确定你的意思是:“如果创建了感兴趣的文件,那么我会放入要监视的 CLOSE_WRITE 事件。”

您可以在同一个轮询中进行监控IN_CREATEIN_CLOSE_WRITE无需在它们之间切换。一旦事件发生,您就可以inotify_event从 inotify 处理程序(从 返回inotify_init())读取该结构,并且它的字段mask将告诉您实际发生了哪个事件。

其次,有机会错过inotify事件。文档中有明确说明。中的“限制和警告”标题下列出了可能出现的问题的完整列表inotify(7)

看来您遇到了“队列溢出”的情况。是的,这是真实的事情,这种情况在繁忙的系统上经常发生。不幸的是,这是不可能纠正的。只能解决它。有多种方法可以解决它,但如果没有更好地了解您的需求,就不能说得更具体。

一般来说,如果您想在更新后立即查看更新的文件 - 只需scandir()按文件排序和/或过滤文件的目录即可mtime。在这种情况下,inotify 将充当“目录中发生了某些事情”的唤醒呼叫,收到后,您将进入检查所有更新的长时间运行过程。一旦他们完成了,就睡在床上poll()。在这种情况下,您将忽略一个事件结束poll()和下一个事件开始之间发生的事件。但您将批量获得所有更新。

相关内容