7

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

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

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

TIA。

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

编辑 2:我想根据这个答案得到这个asio + inotify 示例。不幸的是,这个例子根本不适合我。任何帮助将非常感激。TIA。

4

3 回答 3

7

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

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

PS:刚注意到你提到touch

touch发送以下事件:

IN_OPEN
IN_ATTRIB
IN_CLOSE_WRITE

没有 IN_MODIFY

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

于 2013-03-06T02:21:55.153 回答
3

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

固定版本

于 2013-03-05T18:24:59.977 回答
1

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

于 2013-12-06T21:25:22.143 回答