2016-05-24 128 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