2016-05-24 93 views
0

我目前正在设计一个小型机器人,通过IR信标导航机器人。它全部用C++编码,但整合线路跟踪和IR接收似乎已经破坏了它。 IR使用中断服务程序使用间隔定时器和SIGALRM查找IR信号。寻路功能以及其他一些机器人操作都使用sleep()。现在我注意到,在SIGALRM过早唤醒过程的情况下,您不能在同一个程序中使用SIGALRM和sleep()。除了简单地消除sleep()函数的整个程序之外,是否还有一个很好的解决方法?SIGALRM和睡眠()C++

+0

我能想到的唯一选择是丑陋的hackery,用poll()或select()设置一个空的文件描述符来取代sleep()。 –

回答

0

一个创可贴是使用nanosleep功能代替sleep。如果nanosleep过早醒来,它会将剩余时间存储在时间结构中,因此您可以重新尝试。您可以将其封装在自己的功能中,类似于sleep。由于nanosleep从未与SIGALRM一起实施,所以没有理由为什么它会过早醒来。请务必使用sigaction设置您的报警信号处理程序,并在标志中指定SA_RESTART,完全相同。这使您的信号不会干扰可重新启动的系统调用。

+0

谢谢,这完全解决了我的问题!我使用了一个可以递归调用nanosleep的包装器,直到所有时间都过去了,并且中断似乎没有改变暂停时间。 – Bwood94