假设一个C程序将监视目录中的更改镜像到镜像目录。您递归地观察所有子目录并使用包含watch descriptors
监视目录的pathnames
索引的结构,以便在发生事件时能够重建文件的完整路径名。这就是处理IN_MOVED_FROM
和IN_MOVED_TO
之外的所有事件所需的全部内容。在这两者的情况下,除上述内容外,您似乎还需要以下内容:
cookies
上编制索引的结构,允许您在匹配的watch descriptor
事件出现后存储和检索特定filename
事件的IN_MOVED_FROM
和IN_MOVED_TO
timestamp
- 有序队列(冗余),以便可以将它们重新解释为IN_DELETE
个事件,并在任意时间段内从两个结构中删除已经过去了。pathname/filename
- > watch descriptor
关系(冗余),允许您在(重新)移动的文件系统对象是目录时有效地找出时间watch descriptor
的{{1}},您现在需要查看该目录支持重命名操作相当一些开销。除了等待不成对的cookie超时之外,真的没有其他方法可以检测外部重命名吗?鉴于appears to be a way of telling between a local and foreign rename中存在fsnotify,这似乎是一个相当奇怪的设计选择。
答案 0 :(得分:3)
使用inotify
,您需要设置超时以处理不匹配/未配对/外部重命名操作(例如,mv
文件进出被监视目录),将它们视为{{ 1}}或IN_CREATE
个事件
一旦我处理了与文件同步机制相关的项目,面对同样的问题,并以同样的方式解决了它。
IN_DELETE
API的设计有点令人作呕。以重命名操作为例,inotify
将其解释为 TWO 分隔事件。 :-(
根据您提供的link,Linux内核确实区分了本地/外部重命名操作,您可以使用inotify
接口实现此目的。但由于dnotify
接口已经废除了dnotify
,我不会推荐这个。
答案 1 :(得分:1)
我建议学习或只是链接到libinotifytools库。它处理大多数(如果不是全部)情况。