是否同步注入事件入队?

时间:2019-03-16 13:57:05

标签: c linux inotify

我正在尝试使用return来监视文件系统修改。特别是,我试图在某个预配置目录中捕获文件的所有更新。

当我尝试使用as.Date(x4$cols, origin="1970-01-01")关闭应用程序时出现了问题。我希望所有修改都在此之前进行。

问题: :如果唯一进行文件修改(inotify ing / SIGTERM ing)的进程终止了,可以肯定地说,如果write mv返回0,然后从FIONREAD文件描述符中检索所有修改。 The documentation指定:

  

ioctl返回可读取的字节数   来自inotify文件描述符。

因此,我假设在进行所有修改的过程之后,如果队列中没有任何事件被关闭,那么从inotify描述符中读取所有事件并且以后没有人到达。

2 个答案:

答案 0 :(得分:3)

我强烈建议您使用signalfd,请参阅this man page

通过该信号通过管道传递,而信号动作则异步运行。这样,您可以使用select()epoll()之类的反应堆来等待inotify管道和signalfd()文件描述符,从而可以整齐地管理何时实际从fd中读取信号并处理它。

而且,因为您是在程序的主循环中同步处理信号,而不是在异步信号操作中进行同步,所以在处理信号时可以调用的函数没有限制。

在我的愚见中,signalfd()远远优于处理信号的旧方法。唯一的小缺点是(AFAIK)无法移植到其他* nixes。

答案 1 :(得分:3)

此问题和已接受的答案中有几处东西混在一起。

回答问题的核心:

如果唯一在监视位置更改文件的进程已终止,则可以在inotify队列中没有其他事件时终止。您可以通过检查问题中提到的FIONREAD来安全地检查大小。为了使它不会遗漏任何事件,您需要确定要知道变异过程确实已经通过其他方式完成了;关键的方面是您不希望在完成变异过程并且您的inotify进程收到SIGTERM之前完成对inotify队列的处理。

但是,如果您不知道其他进程是否已经完成,但是要确保已处理到当前时间点的事件(例如:检测到SIGTERM时),您将需要采用类似于watchman中使用的技术。这个概念是当您要求主进程终止时,您将在受监视的目录中创建一个带有魔术名称的特殊标记文件。然后,您将继续处理inotify队列中的事件,直到看到魔术文件名为止。到那时,您可以知道创建魔术文件之前的所有事件均已消耗。这里有关于此技术的更多信息:https://facebook.github.io/watchman/docs/cookies.html(免责声明:我是守卫者)

关于signalfd与传统信号处理的讨论与该问题的计时方面正交:您当然可以使用原始的posix信号处理接口并设置一个全局变量以表明SIGTERM具有已收到。它不会改变inotify事件的顺序或时间,因此在实现该方法时可以随意使用您喜欢的任何方法。