我正在使用nanosleep来停止一段时间的过程。 如何在要求的时间之前中断纳米睡眠? 谢谢!
答案 0 :(得分:6)
如@Kerrek SB所述,设置处理SIGUSR1
的信号处理程序,使用kill(1)
(或使用kill(2)
自行)将信号发送给流程并检查{{ 1}} errno
返回nanosleep(2)
,看看你是否被打断了(如果你想在这种情况下做些不同的事情)。
顺便提一下,在sleep(3)
等人的任何使用中,你想要保证你(大致)所需的时间睡觉,你应该考虑开始时间,检查EINTR
并重新开始如果你被打断了,就会按照修改时间睡觉。
一个(更)更优雅的解决方案,恕我直言,是使用pipe(2)
设置事件并使用poll(2)
来监听管道的读取端具有所需的睡眠超时。如果要中断睡眠,只需将一个字符发送到管道的写入侧即可。该解决方案提供了更精细的解决方案,不需要全局信号处理程序和可怕的副作用。它也容易受到干扰,并且需要与上述相同的EINTR
重启逻辑。
更新:正如@John Bartholomew所说(非常感谢),使用eventfd(2)
是使用pipe(2)
的更好选择。这仅适用于您提供Linux解决方案的情况,因为它不支持BSD(包括Mac OS X):(