inotify '主循环'

Posted

技术标签:

【中文标题】inotify \'主循环\'【英文标题】:inotify 'main loop'inotify '主循环' 【发布时间】:2009-08-15 01:12:48 【问题描述】:

我通过在 inotify 文件描述符,然后使用 fcntl(inotifyfd, F_SETOWN, getpid()) 再加上一个信号(sighandler,SIGIO)调用,所有这些都来自一个进程, 为了设置 inotify 文件描述符事件处理程序。

这个想法是让 inotify 的文件描述符生成 SIGIO 信号(通过 O_ASYNC 标志集)并让信号(..)注册的处理程序处理 SIGIO 信号 因为它们被发出,从而避免轮询 inotify 文件描述符。

在初始设置和信号处理程序设置后,进程无关 并且通常会退出。

我需要相同的进程在设置后保持空闲,因为它充当等待 SIGIO 信号的守护进程。这是我寻求帮助的地方。

如何使进程空闲以占用最少的 cpu 资源?

【问题讨论】:

我怀疑这是*NIX?可能想在标签中指出这一点。 【参考方案1】:

如果您的进程在看到 inotify 事件之前将保持空闲状态,那么您将事情严重过度复杂化。

只需对 inotify 文件描述符执行正常阻塞 read() 即可。当发生 inotify 事件时,您的进程将被唤醒。如果您想阻止超时,以便定期检查其他内容,请使用select()

总的来说,我发现如果答案是“信号”,那么你可能问错了问题:)

【讨论】:

select(后跟 read)绝对是正确的方法。【参考方案2】:

一种简单的方法是在很长一段时间内只使用sleep(3)。由于信号会唤醒进程,因此您需要将睡眠置于循环中:

while(1)
    sleep(1000);

更正确的方法大概是使用sigsuspend(2)

sigsuspend(NULL);

【讨论】:

【参考方案3】:

只需在 sigsuspend() 上循环; ,甚至在这种情况下 sleep() 。但请记住,一个 SIGIO 信号可能有一个 或多个 IO 事件可用。

【讨论】:

以上是关于inotify '主循环'的主要内容,如果未能解决你的问题,请参考以下文章

inotify+rsync+mysql主主复制+keepalived实现zabbix高可用

Spyder's Kite 在我所有的主文件夹中保留了 inotify 手表。我可以避免吗?

实时同步工具原理解释及环境准备inotify

inotify,inotify_add_watch() 监控多个目录,c++

Inotify:目录创建的奇怪行为

inotify+rsync实时同步