gpt4 book ai didi

C++ Linux 中断 nanosleep

转载 作者:太空狗 更新时间:2023-10-29 11:33:03 28 4
gpt4 key购买 nike

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

最佳答案

如@Kerrek SB 所述,设置一个信号处理程序来处理 SIGUSR1,使用 kill(1) 将信号发送到进程(或自己使用 kill(2) )并在返回 nanosleep(2) 时检查 errno 是否有 EINTR看看你是否被打扰了(如果你想在这种情况下做一些不同的事情)。

顺便说一下,在任何情况下使用 sleep(3)等人,如果你想保证你在(大致)所需的时间内 sleep ,你应该开始时间,检查 EINTR 并在你被打扰时使用修改后的时间重新 sleep 。

恕我直言,一个(好得多)更优雅的解决方案是使用 pipe(2) 设置一个事件并使用 poll(2)使用所需的 sleep 超时来监听管道的读取端。如果您想中断 sleep ,只需将一个字符发送到管道的写入端即可。该解决方案提供了更细粒度的解决方案,并且不需要全局信号处理程序和可怕的副作用。它还容易受到中断的影响,并且需要与上述相同的 EINTR 重启逻辑。

更新:如@John Bartholomew 所述(非常感谢),使用 eventfd(2)是使用 pipe(2) 的更好替代方案.这仅在您提供 Linux 解决方案时适用,因为它在 BSD(包括 Mac OS X)上不受支持:(

此消息是在 http://linux.die.net 的广泛帮助下提供给您的

关于C++ Linux 中断 nanosleep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18716667/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com