我一直在调整这里的例子,使其重复观看“修改”的文件。 我的代码在这里 。 在我的testing中,inotify通知只是在文件第一次被修改时触发(即touch
)。 对该文件的任何后续修改都不会导致任何通知触发。 stat
显示“修改”时间已经改变。 此外,修改代码以删除手表,并重新添加每次通知触发(即将inotify_add_watch
和inotify_rm_watch
移到我的示例中的while(1)
循环内)并不能帮助解决此问题。
我想知道这里有没有人可以帮助我做错什么。 另外,虽然我为IN_ALL_EVENTS
添加了一块手表,但我只关心IN_MODIFY
事件。 不知道这是否有任何区别。
另外,这个用例不起作用吗? 我应该改变我的方法来观看目录吗? 请指教。
TIA。
编辑1:正如由themel指出的, i
的处理需要一些修复。 但是即使是固定版本也不会为后续的文件系统“事件”发射通知。 另外,在目录中添加一个监视器而不是文件会显示类似的非确定性行为。
编辑2:我想得到这个基于这个答案工作的asio + inotify示例 。 不幸的是,这个例子并没有为我工作。 任何帮助将非常感激。 TIA。
在themel的修复之后,你的代码在我的测试中看着一个目录时工作的很好。 在观看文件时, event->len
是零,你的代码忽略了通知。
通过在printf语句中将event->len
删除并将所有event->name
替换为file_path
,在观看文件时也可以正常工作。
PS:刚才注意到你提到touch
。
touch
发送以下事件:
IN_OPEN IN_ATTRIB IN_CLOSE_WRITE
没有IN_MODIFY
另外,不要用vim
编辑修改,就像我刚刚做的那样 – 在洗牌工作副本和交换(删除手表)时删除文件。 pico
作品。
你对i
处理被破坏,你永远不会在循环中将它重置为0。 这会导致任何后来的inotify事件,只有当他们比在他们之前最长的事件,这不可能是你想要的时间被考虑。
固定版本 。
当监视一个单独的文件事件 – > len将为0,因为文件名不被返回。 我注意到很多示例程序都有这个问题。