C 检测使用inotify从重命名中移动的外来项

C 检测使用inotify从重命名中移动的外来项,c,linux,inotify,C,Linux,Inotify,假设一个C程序将监视目录中的更改镜像到镜像目录。递归地监视所有子目录,并使用包含监视目录路径名的监视描述符索引的结构,以便在发生事件时能够重建文件的完整路径名。这就是您处理所有事件所需的全部内容,但IN_MOVED_和IN_MOVED_除外。在这两种情况下,除上述情况外,您似乎还需要以下几点: 一种在cookies上建立索引的结构,允许您在出现与IN_MOVED_to事件匹配的IN_MOVED_FROM事件时存储和检索特定IN_MOVED_FROM事件的监视描述符和文件名。 时间戳排序的队列冗余

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

一种在cookies上建立索引的结构,允许您在出现与IN_MOVED_to事件匹配的IN_MOVED_FROM事件时存储和检索特定IN_MOVED_FROM事件的监视描述符和文件名。 时间戳排序的队列冗余,包含尚未配对的Cookie,以便在经过任意时间段后,可以将它们重新解释为IN_DELETE事件并从这两个结构中删除。 路径名/filename->watch descriptor关系是冗余的,它允许您在删除的文件系统对象是目录的情况下有效地查找超时cookie的watch descriptor,您现在需要取消匹配该目录。
支持重命名操作的开销相当大。除了等待未配对的cookie超时之外,真的没有其他方法检测外来重命名吗?考虑到这个事实,这似乎是一个相当奇怪的设计选择。

我建议要么学习,要么直接链接到图书馆。它可以处理大多数(如果不是所有的话)。

我建议要么学习,要么直接链接到图书馆。它可以处理大多数情况(如果不是所有情况的话)。

使用inotify,您需要设置一个超时来处理不匹配/未配对/外部重命名操作eg。将文件放入或移出监视的目录,将其视为IN_CREATE或IN_DELETE事件。 有一次,我在一个与文件同步机制相关的项目中工作,遇到了同样的问题,并以同样的方式解决了它

总之,inotify API的设计有点恶心。以重命名操作为例,inotify将其解释为两个独立的事件:

根据您给出的示例,Linux内核确实区分了本地/外部重命名操作,您可以使用dnotify接口实现这一点。但由于dnotify已经被inotify接口淘汰,我不推荐这样做

参考:

使用inotify,您需要设置超时来处理不匹配/未配对/外部重命名操作eg。将文件放入或移出监视的目录,将其视为IN_CREATE或IN_DELETE事件。 有一次,我在一个与文件同步机制相关的项目中工作,遇到了同样的问题,并以同样的方式解决了它

总之,inotify API的设计有点恶心。以重命名操作为例,inotify将其解释为两个独立的事件:

根据您给出的示例,Linux内核确实区分了本地/外部重命名操作,您可以使用dnotify接口实现这一点。但由于dnotify已经被inotify接口淘汰,我不推荐这样做

参考:
我会考虑镜像命令。要么直接使用它,要么仔细阅读源代码。并且该命令不使用inotify来检测文件系统事件。事实上,它似乎根本没有检测到文件系统事件——它只是镜像目录并退出,而不是监视目录的更改。IMO——这是因为真正的镜像在内核的驱动程序级别运行。rsync还将更改镜像到本地/非本地目录。它也会运行和退出。所以,除了为了学习,我看不到试图开发一个用户区镜像。这确实是为了学习。此外,除了更名之外,IntualDealCub似乎是一个可行的用户端解决方案。我会考虑镜像命令。要么直接使用它,要么仔细阅读源代码。并且该命令不使用inotify来检测文件系统事件。事实上,它似乎根本没有检测到文件系统事件——它只是镜像目录并退出,而不是监视目录的更改。IMO——这是因为真正的镜像在内核的驱动程序级别运行。rsync还将更改镜像到本地/非本地目录。它也会运行和退出。所以,除了为了学习,我看不到试图开发一个用户区镜像。这确实是为了学习。此外,除了重命名,inotify库对我来说似乎是一个可行的用户区解决方案。它不仅被弃用,而且在我查找它时,我甚至找不到任何dnotify文档。@Witiko看看这个:可爱。显然,我挖得不够深。它不仅被弃用,而且在我寻找它的时候,我甚至找不到任何通知文档。@Witiko看看这个:可爱。显然,我挖得不够深。一旦我有自由选择图书馆,我肯定会的。现在,我认为检查图书馆的来源是最明智的做法 如果我想选择一个图书馆,我肯定会的。目前,我认为检查图书馆的来源是最明智的做法。