C ++ Linux中断nanosleep

时间:2013-09-10 10:36:53

标签: c++ linux

我正在使用nanosleep来停止一段时间的过程。 如何在要求的时间之前中断纳米睡眠? 谢谢!

1 个答案:

答案 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):(

http://linux.die.net

的广泛帮助下,此消息已经发送给您