我一直在调整示例here,使其重复观看“修改”文件。我的代码是here。在我的测试中,inotify通知仅在文件第一次被“修改”时触发(即touch
'ed)。对文件的任何后续修改都不会导致触发任何通知。 stat
表示“修改”时间已更改。此外,修改代码以删除手表并在每次通知触发时重新添加(即移动inotify_add_watch
和inotify_rm_watch
进入sample中的while(1)
循环内部)没有帮助解决这个问题。
我想知道这里的任何人是否可以帮助解决我可能做错的事情。另外,虽然我为IN_ALL_EVENTS
添加了一个手表,但我真的只关心IN_MODIFY
事件。不确定这是否有所不同。
此外,这个用例不起作用吗?我应该改变观察目录的方法吗?请指教。
TIA。
编辑1:正如themel所述,i
的处理需要一些修复。但是,即使是固定版本也不会为后续文件系统“事件”触发通知。此外,在目录上添加监视而不是文件表现出类似的非确定性行为。
编辑2:我想基于asio + inotify example获得此this answer。不幸的是,这个例子根本不适用于我。任何帮助将非常感激。 TIA。
答案 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事件仅在它们长于它们之前的最长事件时被考虑,这可能不是您想要的。
答案 2 :(得分:1)
监视单个文件事件时 - > len将为0,因为不返回文件名。我注意到很多示例程序都有这个问题。