是否有人关注sleep()
和alarm()
的组合?我一直听说这样做很糟糕,因为他们可能都依赖于相同的计时器并且相互冲突。
我认为使用alarm()
容易出错,并希望看到不同的解决方案或任何想法,以便我可以使用与睡眠兼容的内容从我的代码中删除警报。
答案 0 :(得分:2)
当您使用sleep
时,进程将以毫秒为单位进入睡眠状态,alarm
将返回sleep
之后的剩余秒数。 alarm
在提到的时间后终止该过程。
是的,sleep
和alarm
将使用相同的计时器。因此,我们有责任计算sleep()
之后发生alarm()
时的剩余秒数。
例如: 如果你使用
alarm(5);---------------> An alarm is set for 5 seconds.
sleep(3);---------------> Process goes to sleep state for 3 seconds.
alarm(7);---------------> This alarm returns the seconds remaining after sleep is set i.e it returns 2.
然后alarm
设置为7秒。完全过程在12秒后终止,此时过程时间超过12秒。
如果sleep
时间更长,
示例2:
alarm(5);
sleep(7);
然后该过程在5秒后终止。
答案 1 :(得分:0)
混合sleep
和alarm
时存在多种可能的兼容性问题。
首先,sleep
将被信号中断,例如来自alarm
的信号。所以你总是要检查你的sleep
是否真的按照你想要的那样睡觉了。
但第二个可能更大的问题是,某些系统sleep
可能会在内部实现为:alarm(s); pause();
而没有正确重置之前的alarm
,这实际上意味着sleep
会破坏你可能设置的任何警报。
如果您的功能真的取决于能够睡眠并获得彼此独立的警报,请查看使用setitimer
设置您自己的计时器并围绕它构建您自己的计时框架。进入睡眠状态时,将itimer设置为睡眠时间长度pause()
(检查是否早期被其他信号唤醒),然后将计时器设置为报警状态。
答案 2 :(得分:0)
我认为使用alarm()容易出错,并希望看到不同的解决方案或任何想法,以便我可以通过与睡眠兼容的内容从我的代码中删除警报。
sleep()
是使用SIGALRM
实现的,nanosleep()
未实现,因此我建议将sleep()
替换为nanosleep()
。
答案 3 :(得分:0)
阅读time(7)手册页。
最近的Linux还提供poll(2)(以及ppoll(2)
和select(2)
以及pselect(2)
...),clock_gettime(2),timer_create(2),{{ 3}},timerfd_create(2),signalfd(2),eventfd(2) ...