【问题标题】:inotify not firing notifications on file modificationinotify 不触发文件修改通知
【发布时间】:2013-03-05 15:56:59
【问题描述】:

我一直在调整示例 here 以使其反复监视文件以进行“修改”。我的代码是here。在我的测试中,inotify 通知仅在文件第一次“修改”时触发(即touch'ed)。对该文件的任何后续修改都不会导致触发任何通知。 stat 表示“修改”时间已更改。此外,修改代码以删除手表并在每次触发通知时重新添加(即将inotify_add_watchinotify_rm_watch 移动到我的while(1) 循环内sample)无助于解决此问题。

我想知道这里是否有人可以帮助解决我可能做错的事情。另外,虽然我添加了IN_ALL_EVENTS 的手表,但我真的只关心IN_MODIFY 事件。不确定这是否有什么不同。

另外,这个用例不工作吗?我应该改变我的方法来观看目录吗?请指教。

TIA。

编辑 1:正如 themel 所指出的,i 的处理需要一些修复。然而,即使是固定版本也不会触发后续文件系统“事件”的通知。此外,在目录而不是文件上添加监视会表现出类似的非确定性行为。

编辑 2:我想让这个基于 this answerasio + inotify example 工作。不幸的是,这个例子根本不适合我。任何帮助将非常感激。 TIA。

【问题讨论】:

    标签: c++ linux filesystems inotify


    【解决方案1】:

    在主题修复后,在我的测试中,您的代码在查看目录时可以正常工作。观看文件时,event->len 为零,您的代码会忽略通知。

    删除event->len 的测试并在printf 语句中将所有event->name 替换为file_path,它在查看文件时也能正常工作。

    PS:刚刚注意到你提到了touch

    touch 发送以下事件:

    IN_OPEN
    IN_ATTRIB
    IN_CLOSE_WRITE
    

    没有 IN_MODIFY

    另外,不要像我刚才那样通过使用vim 编辑它来测试修改 - 它会在改组工作副本和交换时删除文件,这会删除手表。 pico 有效。

    【讨论】:

    • 虽然我想知道为什么touch 不会引起IN_MODIFY 通知。 stat 似乎暗示touch 修改了文件的Modify 时间。
    • IN_MODIFY 指的是对文件数据的实际修改。时间是元数据的一部分,是文件系统的一个属性。
    【解决方案2】:

    您对i 的处理已损坏,您从未在循环中将其重置为 0。这会导致任何后来的 inotify 事件仅在它们比它们之前的最长事件长时才被考虑,这可能不是您想要的。

    Fixed version.

    【讨论】:

    • 你是对的。 i 的处理肯定被破坏了 - 感谢您发现这一点。然而,即使是固定版本似乎也错过了以后的通知(在第一个通知触发之后)。有解决此问题的想法吗?
    • 嗯,我不断收到带有该代码的 inotify 事件(但您的条件都不会触发,因为 a)在观看单个文件时,事件->名称将始终为空,并且 b)触摸会给您 IN_ATTRIB事件,而不是 IN_MODIFY)。
    【解决方案3】:

    当监控单个文件事件时->len 将为 0,因为没有返回文件名。我注意到很多示例程序都有这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      相关资源
      最近更新 更多