在Linux上每10毫秒定期执行一个函数

我目前正在制定一个必须定期做一些工作的计划。 目前我使用以下结构:

int main(int argn, char** argv) { for(;;) { //Do work - the programm spends 5-8ms here nanosleep(...); //Sleep 10ms } return 0; } 

问题是:一个循环执行应该总是持续10ms。 由于在循环的工作部分花费了大量的时间,所以我不能简单地睡10ms …

解决scheme可能是测量clock_gettime()工作时间,并相应地调整nanosleep() 。 但是我对这个解决scheme并不满意,因为在测量的区域之外放置代码是非常容易的。

我已经search了互联网的替代品,我发现了三个电话:

  • timer_create
  • getitimer
  • 报警
  • timerfd_create

如果解决scheme不能移植到Windows或其他操作系统,那也没关系。

但我不确定哪个解决scheme最适合我的问题。 任何意见或build议? 我提到的4个select有什么优点和缺点?

编辑:也有这个解决scheme的另一个问题:如果我得到的文档权利, nanosleep系统调用进程进入睡眠至less10ms,但它可能需要更长的时间,如果系统负载…有什么办法优化?

编辑2:为了您的信息:在做工作部分networking请求是对networking上的另一个设备(一个微控制器或一个能够及时回答请求的PLC)进行的。 结果正在处理并发送回设备。 我知道Linux不是一个实时的操作系统,并不是最佳的这种任务…如果解决scheme不是完美的实时,这是没有问题的,但它将是很好的获得尽可能多的实时。

使用clock_nanosleep ,它可以让你请求睡眠,直到给定的绝对时间( TIMER_ABSTIME标志),而不是持续时间。 然后你可以在每次迭代时简单地递增目标绝对时间10ms。

使用clock_nanosleep也允许你(如果你想)使用单调时钟选项,并避免在程序运行时处理用户/管理员重置系统时钟的可能性。

检查在nanosleep睡眠之前的时间,并计算在那里睡多久。 将不需要测量任何代码。 只要注意从nanosleep睡休息时间,并计算你需要多少时间睡觉的时间。

信号处理是最好的方法。我更喜欢timer_create,因为它是符合POSIX.1-2001的posix函数。 微软还为编写POSIX标准代码提供帮助 。