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。

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