2

我正在使用 nanosleep 将进程停止一段时间。如何在请求的时间之前中断 nanosleep?谢谢!

4

1 回答 1

6

正如@Kerrek SB 所提到的,设置一个信号处理程序来处理SIGUSR1,将信号发送到使用kill(1)(或自我使用kill(2))的进程,并在返回时检查errnoEINTR是否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 回答