我正在尝试使用return
来监视文件系统修改。特别是,我试图在某个预配置目录中捕获文件的所有更新。
当我尝试使用as.Date(x4$cols, origin="1970-01-01")
关闭应用程序时出现了问题。我希望所有修改都在此之前进行。
问题: :如果唯一进行文件修改(inotify
ing / SIGTERM
ing)的进程终止了,可以肯定地说,如果write
mv
返回0,然后从FIONREAD
文件描述符中检索所有修改。 The documentation指定:
ioctl
返回可读取的字节数 来自inotify文件描述符。
因此,我假设在进行所有修改的过程之后,如果队列中没有任何事件被关闭,那么从inotify描述符中读取所有事件并且以后没有人到达。
答案 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事件的顺序或时间,因此在实现该方法时可以随意使用您喜欢的任何方法。