使用inotify检测外部IN_MOVED_FROM重命名

时间:2013-11-30 13:44:35

标签: c linux inotify

假设一个C程序将监视目录中的更改镜像到镜像目录。您递归地观察所有子目录并使用包含watch descriptors监视目录的pathnames索引的结构,以便在发生事件时能够重建文件的完整路径名。这就是处理IN_MOVED_FROMIN_MOVED_TO之外的所有事件所需的全部内容。在这两者的情况下,除上述内容外,您似乎还需要以下内容:

  • cookies上编制索引的结构,允许您在匹配的watch descriptor事件出现后存储和检索特定filename事件的IN_MOVED_FROMIN_MOVED_TO
  • 包含尚未配对的Cookie的timestamp - 有序队列(冗余),以便可以将它们重新解释为IN_DELETE个事件,并在任意时间段内从两个结构中删除已经过去了。
  • A pathname/filename - > watch descriptor关系(冗余),允许您在(重新)移动的文件系统对象是目录时有效地找出时间watch descriptor的{​​{1}},您现在需要查看该目录

支持重命名操作相当一些开销。除了等待不成对的cookie超时之外,真的没有其他方法可以检测外部重命名吗?鉴于appears to be a way of telling between a local and foreign rename中存在fsnotify,这似乎是一个相当奇怪的设计选择。

2 个答案:

答案 0 :(得分:3)

使用inotify,您需要设置超时以处理不匹配/未配对/外部重命名操作(例如,mv文件进出被监视目录),将它们视为{{ 1}}或IN_CREATE个事件 一旦我处理了与文件同步机制相关的项目,面对同样的问题,并以同样的方式解决了它。

恕我直言,IN_DELETE API的设计有点令人作呕。以重命名操作为例,inotify将其解释为 TWO 分隔事件。 :-(

根据您提供的link,Linux内核确实区分了本地/外部重命名操作,您可以使用inotify接口实现此目的。但由于dnotify接口已经废除了dnotify,我不会推荐这个。

参考:
http://en.wikipedia.org/wiki/Dnotify

答案 1 :(得分:1)

我建议学习或只是链接到libinotifytools库。它处理大多数(如果不是全部)情况。