gpt4 book ai didi

c - 使用 inotify 检测外部 IN_MOVED_FROM 重命名

转载 作者:太空狗 更新时间:2023-10-29 11:45:09 28 4
gpt4 key购买 nike

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

  • cookies 上索引的结构允许您存储和检索 watch descriptorfilename一个特定的IN_MOVED_FROM一次匹配 IN_MOVED_TO 的事件事件出现。
  • A timestamp -有序队列(冗余)包含尚未配对的 cookie,以便它们可以重新解释为 IN_DELETE事件并在任意时间段过去后从两个结构中删除。
  • A pathname/filename -> watch descriptor关系(冗余),它可以让你有效地找出 watch descriptor超时的 cookie如果(重新)移动的文件系统对象是一个目录,您现在需要取消监视。

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

最佳答案

使用 inotify,您需要设置一个超时时间来处理不匹配/未配对/外部重命名操作(例如,mv 文件进出监视目录) ,将它们视为 IN_CREATEIN_DELETE 事件。
有一次做一个文件同步机制相关的项目,遇到同样的问题,也是用同样的方法解决的。

恕我直言,inotify API 的设计有些恶心。以重命名操作为例,inotify 将其解释为两个 分隔事件。 :-(

根据link你给,Linux内核确实区分本地/外部重命名操作,你可以使用dnotify接口(interface)来实现这一点。但是由于 dnotify 已经被 inotify 接口(interface)淘汰了,我不推荐这个。

引用:
http://en.wikipedia.org/wiki/Dnotify

关于c - 使用 inotify 检测外部 IN_MOVED_FROM 重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20300955/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com