如@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的广泛帮助下,此消息已经发送给您
| 归档时间: |
|
| 查看次数: |
2036 次 |
| 最近记录: |