inotify'main loop'

时间:2009-08-15 01:12:49

标签: c linux

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

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

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

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

如何使进程空闲以获取最少量的cpu资源?

3 个答案:

答案 0 :(得分:6)

如果您的流程在看到inotify事件之前一直处于空闲状态,那么您就会严重过度复杂化。

在inotify文件描述符上执行正常的阻塞read()。当有inotify事件时,您的进程将被唤醒。如果您想要阻止超时,那么您可以定期检查其他内容,请使用select()

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

答案 1 :(得分:2)

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

while(1)
    sleep(1000);

更正确的方法可能是使用sigsuspend(2)

sigsuspend(NULL);

答案 2 :(得分:0)

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