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

相关问题