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