LINUX应用开发-定时器

       在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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章