我通过设置O_ASYNC标志来使用inotify和“interupt io” inotify文件描述符,然后使用fcntl(inotifyfd,F_SETOWN,getpid()) 加上一个信号(sighandler,SIGIO)调用,所有这些都来自一个进程, 为了设置inotify文件描述符事件处理程序。
这个想法是让inotify的文件描述符生成SIGIO信号(通过O_ASYNC标志集)并让teh信号(..)注册处理程序处理SIGIO信号 因为它们被发射,因此避免轮询inotify文件描述符。
初始设置和信号处理程序设置后,该过程无关 并且通常会退出。
我需要在设置后保持空闲的相同进程,因为它充当等待SIGIO信号的守护进程。这是我在寻求帮助的地方。
如何使进程空闲以获取最少量的cpu资源?
答案 0 :(得分:6)
如果您的流程在看到inotify事件之前一直处于空闲状态,那么您就会严重过度复杂化。
在inotify文件描述符上执行正常的阻塞read()
。当有inotify事件时,您的进程将被唤醒。如果您想要阻止超时,那么您可以定期检查其他内容,请使用select()
。
一般来说,我发现如果答案是“信号”那么你可能会问错了问题:)
答案 1 :(得分:2)
一个简单的方法就是sleep(3)
只需要很长时间。由于信号会唤醒进程,因此您需要将睡眠置于循环中:
while(1)
sleep(1000);
更正确的方法可能是使用sigsuspend(2)
:
sigsuspend(NULL);
答案 2 :(得分:0)
只需循环sigsuspend(); ,甚至睡觉()在这种情况下。但请记住,一个SIGIO信号可能有一个或更多 IO事件可用。