有人关心sleep()
and的组合alarm()
吗?我一直听说这样做很糟糕,因为它们可能都依赖同一个计时器并相互冲突。
我认为 usingalarm()
容易出错,并希望看到不同的解决方案或任何想法,以便我可以使用与 sleep 非常兼容的东西从我的代码中删除警报。
当您使用 asleep
时,进程会在提到的毫秒时间内进入睡眠状态,并且alarm
将在 之后返回剩余的秒数sleep
。Analarm
在提到的时间后终止该过程。
是的,sleep
并且alarm
将使用相同的计时器。因此,当 asleep()
出现在 a 之后时,我们有责任计算剩余秒数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 秒后终止。
阅读time(7)手册页。
最近的 Linux 还提供poll(2) (and ppoll(2)
and select(2)
and pselect(2)
...), clock_gettime(2) , timer_create(2) , timerfd_create(2) , signalfd(2) , eventfd(2) , nanosleep(2) ...
混合sleep
和alarm
.
第一个是sleep
会被信号打断,比如来自alarm
. 所以你总是要检查你是否sleep
真的睡了你想要的时间。
但第二个潜在的更大问题是,在某些系统上sleep
可能在内部实现类似:alarm(s); pause();
没有正确重置以前的alarm
系统,这实际上意味着sleep
会破坏您可能设置的任何警报。
如果您的功能真的依赖于能够睡眠并获得彼此独立的警报,请考虑设置您自己的计时器setitimer
并围绕它构建您自己的计时框架。睡觉时,将计时器设置为睡眠时长pause()
(检查您是否被其他信号提前唤醒),然后将计时器设置回闹钟的时间。
我认为使用 alarm() 容易出错,并且希望看到不同的解决方案或任何想法,以便我可以使用与睡眠非常兼容的东西从我的代码中删除警报。
sleep()
是使用SIGALRM
, nanosleep()
is not 实现的,所以我建议sleep()
用nanosleep()
.