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 手表。我可以避免吗?