SIGALRM和sleep()c ++

时间:2016-05-24 01:40:36

标签: c++

我目前正在设计一条跟随机器人的小型生产线,通过红外信标进行导航。它全部用C ++编码,但是整合线路跟随和IR接收似乎打破了它。 IR使用中断服务程序使用间隔定时器和SIGALRM查找IR信号。寻路功能以及其他几个机器人操作都使用sleep()。现在我注意到你不能在同一个程序中使用SIGALRM和sleep(),因为SIGALRM过早地唤醒了这个过程。除了简单地消除整个sleep()函数程序之外,还有一个很好的解决方法吗?

1 个答案:

答案 0 :(得分:0)

一个创可贴修复是使用nanosleep功能而不是sleep。如果nanosleep过早醒来,它会将剩余时间存储到时间结构中,因此您可以重新尝试。您可以将它包装在类似sleep的自己的函数中。由于nanosleep并未使用SIGALRM实现,因此没有理由让它过早醒来。请务必使用sigaction设置警报信号处理程序,并在标志中指定SA_RESTART,完全相同。这样可以使您的信号不会干扰可重新启动的系统调用。