2013-04-18 51 views
-2

我需要能夠使用C/C++在Linux上以不同的時間間隔調用某些函數。什麼是最好的方法來做到這一點?例如,我想在100hz調用(),在10h調用b(),在1hz調用c()。在某些時間間隔的Linux函數調用

+5

你有沒有困擾谷歌「計時器在Linux上」? – StoryTeller

+0

一些舊的Linux內核可能無法可靠地調用100Hz的函數。 –

回答

1

您可以重複使用settimer來安排接近最後期限的下一個函數調用。

+0

我意識到,無論如何要在程序開始時設置以不同的間隔調用某些函數? – user1620479

+1

間隔是偶數比率...因此每10個100hz的呼叫是10hz,每100個是1個hz。只要系統能夠以期望的分辨率可靠地提供定時器,一個定時器就足夠了。 –

1

您可以使用Posix計時器,即timer_create(2)timer_settime(2)。然後,您要使用sigaction(2)設置信號處理程序。請注意,信號處理函數只允許調用一組非常有限的函數(僅限異步信號安全函數,但不包括fprintfmalloc!),請參閱​​,並考慮簡單地在信號中設置volatile sigatomic_t變量處理程序(並在外部進行適當測試)。

你可能會改爲有一些事件循環(例如libev,或者自己製作一個像poll(2)等多路複用系統調用等等)。如果您正在編寫一個圖形化應用程序(使用例如Qt或Gtk),那麼您已經有了一個事件循環,所以使用它(並且您還提供了圖形工具包或事件循環函數提供的定時器)。

您可能還想看看timerfd_create(2)和朋友(並在您的事件循環或poll(2)調用中使用該描述符)。

閱讀Advanced Linux Programming應該有所幫助。

PS。使用舊內核和舊機器可能難以獲得可靠的100Hz(或略高)的定時器頻率。您可能需要CONFIG_HIGH_RES_TIMERS=yCONFIG_TIMERFD=yCONFIG_HPET_TIMER=yCONFIG_HZ_1000=y位於您最近的內核的.config

相關問題