0

有人关心sleep()and的组合alarm()吗?我一直听说这样做很糟糕,因为它们可能都依赖同一个计时器并相互冲突。

我认为 usingalarm()容易出错,并希望看到不同的解决方案或任何想法,以便我可以使用与 sleep 非常兼容的东西从我的代码中删除警报。

4

4 回答 4

2

当您使用 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 秒后终止。

于 2013-09-25T08:35:57.167 回答
0

阅读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) ...

于 2013-09-25T11:03:18.527 回答
0

混合sleepalarm.

第一个是sleep会被信号打断,比如来自alarm. 所以你总是要检查你是否sleep真的睡了你想要的时间。

但第二个潜在的更大问题是,在某些系统上sleep可能在内部实现类似:alarm(s); pause();没有正确重置以前的alarm系统,这实际上意味着sleep会破坏您可能设置的任何警报。

如果您的功能真的依赖于能够睡眠并获得彼此独立的警报,请考虑设置您自己的计时器setitimer并围绕它构建您自己的计时框架。睡觉时,将计时器设置为睡眠时长pause()(检查您是否被其他信号提前唤醒),然后将计时器设置回闹钟的时间。

于 2013-09-25T08:46:59.487 回答
0

我认为使用 alarm() 容易出错,并且希望看到不同的解决方案或任何想法,以便我可以使用与睡眠非常兼容的东西从我的代码中删除警报。

sleep()是使用SIGALRM, nanosleep()is not 实现的,所以我建议sleep()nanosleep().

于 2013-09-25T08:58:58.960 回答