C++ Linux中断nanosleep

use*_*268 2 c++ linux

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

tro*_*foe 6

如@Kerrek SB所述,设置一个信号处理程序来处理SIGUSR1,使用kill(1)(或自我使用kill(2))将信号发送到进程errno,EINTR并在返回时检查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的广泛帮助下,此消息已经发送给您