inotify不会在文件修改时触发通知

时间:2013-03-05 15:56:59

标签: c++ linux filesystems inotify

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

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

此外,这个用例不起作用吗?我应该改变观察目录的方法吗?请指教。

TIA。

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

编辑2:我想基于asio + inotify example获得此this answer。不幸的是,这个例子根本不适用于我。任何帮助将非常感激。 TIA。

3 个答案:

答案 0 :(得分:5)

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

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

PS:刚刚注意到你提到touch

touch发送以下事件:

IN_OPEN
IN_ATTRIB
IN_CLOSE_WRITE

没有IN_MODIFY

此外,不要像我刚才那样用vim进行编辑来测试修改 - 它会在移动工作副本和交换时删除文件,从而删除手表。 pico有效。

答案 1 :(得分:3)

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

Fixed version

答案 2 :(得分:1)

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