inotify:事件报告的顺序是不是与它们在文件系统中发生的顺序完全相同?
Posted
技术标签:
【中文标题】inotify:事件报告的顺序是不是与它们在文件系统中发生的顺序完全相同?【英文标题】:inotify: are the events reported in strictly the same order as they have occured in the file system?inotify:事件报告的顺序是否与它们在文件系统中发生的顺序完全相同? 【发布时间】:2014-05-21 09:11:51 【问题描述】:我正在使用 inotify 来监视 各种 分区(可能位于不同的硬盘上)上的 各种 目录。为了确保收集到某个时间点之前发生的所有事件T,我正在触摸我的主目录中的一个特殊文件并等待 inotify 报告这种修改。收到此通知后,我能否确定我也收到了 T 之前所有修改的所有事件(针对所有目录和所有分区)?
【问题讨论】:
出于好奇,为什么您需要知道哪个事件实际发生得更早,以及您会使用什么标准来判断哪个事件实际发生得更早? 【参考方案1】:我不确定这是否适用于同一 inotify 实例上不同文件系统上的监视,但可以权威地说该技术通常确实有效:我们在 Watchman 中使用它(我们在这里描述它:https://facebook.github.io/watchman/docs/cookies.html)
我们假设这不会跨文件系统边界正确排序,并为每个受监视的根创建一个实例;这使我们更容易正确地跟踪和关联事件。我们还必须处理 fsevents、kqueue 和其他监视实现,因此我们尽量避免与底层实现过于紧密地耦合。
根据您的具体用例,您可能能够在每个文件系统中使用一个实例,并在您的时间 T 触摸每个实例的根目录中的一个特殊文件。前提是您已经观察了两个特殊文件变化,你知道你已经看到了时间 T 的所有内容,也许还有更多。如果“可能多一点”部分不是破坏交易,那么你就是黄金。
【讨论】:
非常感谢 Wez 分享这次经历。【参考方案2】:内核中的inotify documentation 表示“每个 [inotify] 实例都与一个唯一的有序队列相关联。” 所以,我认为与添加到给定实例的手表相关的事件(使用 inotify_init() 创建)按照它们发生的顺序接收。
【讨论】:
我已经阅读了文档的那一部分,但是它没有回答我的问题(尽管我同意,但很可能就是这种情况)。 文档中有另一部分:“问:使用每实例的 fd 而不是每手表的 fd 背后的设计决策是什么?”这解释了 inotify 实例允许保留事件顺序。 谢谢,Christophe,我想这就是我正在寻找的声明。让我们把它,包括kernel.org/doc/Documentation/filesystems/inotify.txt的链接,放到答案中,我会接受它。以上是关于inotify:事件报告的顺序是不是与它们在文件系统中发生的顺序完全相同?的主要内容,如果未能解决你的问题,请参考以下文章