我正在尝试实现一个后台用户空间程序,该程序将在Linux中每100ms执行各种任务和计算。我可以通过在Linux中使用警报信号来实现这一点,下面的结构是我实现间隔计时器的方式。
void timer_handler (int signum){
printf("In timer handler!n");
}
int main (){
struct sigaction s_action;
struct itimerval timer;
/* Set Up a Timer */
/* Install timer_handler as the signal handler for SIGVTALRM. */
memset (&s_action, 0, sizeof (s_action));
s_action.sa_handler = &timer_handler;
sigaction (SIGVTALRM, &s_action, NULL);
/* Timer configuration for 100ms */
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 100000;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 100000;
/* Set up the timer */
setitimer (ITIMER_VIRTUAL, &timer, NULL);
while(1);
}
然而,由于无限循环,这种方法似乎不是实现这一点的最佳方式(就性能而言)。它显著提高了CPU利用率。一旦它开始在后台运行,我的其他程序的性能就会下降15%。
理想情况下,我想要的是有一个程序,除非计时器中断,否则它将保持睡眠。多线程似乎是一种选择,但我对这个主题没有太多经验。我将感谢任何关于如何以最小的开销实现这样的程序的建议或指针。
读取时间(7)、信号(7),timerfd_create(2)、轮询(2),nanosleep(2)和高级Linux编程。
您的信号处理程序不正确(它不应该调用printf
;它可能调用write
)。
你可以有
while(1) poll(NULL, 0, 1);
但是在用CCD_ 4初始化的文件描述符上使用CCD_。
当然,我认为你相当有信心,每一项周期性任务的持续时间都比这段时间短得多。(例如,每个任务不需要超过50毫秒,但具有100毫秒的周期)。