在LINUX应用程序开发的过程中,经常会用到定时器来周期性的做某件事情,虽然说LINUX是一个非严格实时操作系统,但对于时间精度要求不是特别严格的系统而言,LINUX的定时器还是有它的用处的,下面就简单介绍下LINUX定时器的用法。
a)在main函数中进行定时器初始化
void TimerInit()
{
struct itimerval tick;
signal(SIGALRM, (__sighandler_t)TimerCount);
//收到一个SIGALRM信号时,进入TimerCount函数。
memset(&tick, 0, sizeof(tick));
//间隔时间
tick.it_interval.tv_sec = 0;
tick.it_interval.tv_usec = 10000;//10ms
//初始定时时间
tick.it_value.tv_sec = 0;
tick.it_value.tv_usec = 10000;//10ms
//根据tick内的参数,每隔一段时间产生一个SIGALRM信号。ITIMER_REAL参数表示系统运行时间。
if (setitimer(ITIMER_REAL, &tick, NULL) < 0)
{
fprintf(fp, "Set timer failed!\n");
exit(1);
}
}
b) 定义TimerCount函数体,在此函数体内实现需要周期实现的功能。
注意:如果在当前线程启用了定时器,再用sleep/usleep去休眠某段时间,就会出现无效的情况,这是由于sleep/usleep的唤醒机制与定时器的唤醒机制是相同的,都是接收SIGALRM信号,也就是说当定时器的定时周期到达时,会产生一个SIGALRM信号,来唤醒sleep/usleep的休眠过程,导致sleep/usleep的时间远比设定的休眠时间短,可能会形成调试过程中的难以发现的BUG。