我正在使用 nanosleep 将进程停止一段时间。如何在请求的时间之前中断 nanosleep?谢谢!
问问题
2657 次
1 回答
6
正如@Kerrek SB 所提到的,设置一个信号处理程序来处理SIGUSR1
,将信号发送到使用kill(1)
(或自我使用kill(2)
)的进程,并在返回时检查errno
你EINTR
是否nanosleep(2)
被打断(如果你想做在这种情况下有所不同)。
顺便说一句,在任何使用sleep(3)
et al 的情况下,如果您想保证(大致)睡到所需的时间,您应该在开始时间,检查EINTR
如果您被打断,请检查并按照修改后的时间重新入睡。
恕我直言,一个(更)更优雅的解决方案是设置一个事件,使用pipe(2)
并使用poll(2)
在管道的读取端监听所需的睡眠超时。如果您想中断睡眠,您只需将一个字符发送到管道的写入端。该解决方案提供了更细粒度的解决方案,并且不需要全局信号处理程序和可怕的副作用。它也容易受到中断,并且需要与EINTR
上面提到的相同的重启逻辑。
更新:正如@John Bartholomew 提到的(非常感谢),使用eventfd(2)
是使用的更好选择pipe(2)
。这仅适用于您提供 Linux 解决方案的情况,因为 BSD(包括 Mac OS X)不支持它:(
在http://linux.die.net的广泛帮助下,此消息已带给您
于 2013-09-10T10:46:41.280 回答