在linux中报警和睡眠

时间:2013-09-25 07:55:30

标签: c linux unix

是否有人关注sleep()alarm()的组合?我一直听说这样做很糟糕,因为他们可能都依赖于相同的计时器并且相互冲突。

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

4 个答案:

答案 0 :(得分:2)

当您使用sleep时,进程将以毫秒为单位进入睡眠状态,alarm将返回sleep之后的剩余秒数。 alarm在提到的时间后终止该过程。

是的,sleepalarm将使用相同的计时器。因此,我们有责任计算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)

混合sleepalarm时存在多种可能的兼容性问题。

首先,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) ...