定時器是我們需要經常處理的一種資源。那linux下面的定時器又是怎麼一回事呢?其實,在linux裏面有一種進程中信息傳遞的方法,那就是信號。這裏的定時器就相當於系統每隔一段時間給進程發一個定時信號,我們所要做的就是定義一個信號處理函數。
在這之前,先看linux中定義好的一個結構體:struct itimerval;
struct itimerval {//結構體中又包含結構體timeval
struct timeval it_interval;//表示時間間隔,包括秒和微妙
struct timeval it_value; //表示第一次定的時間,也包括秒和微妙, 這個時間爲0後,會把上一個時間賦給他,已達到循環的目的,如果
//不需循環,則it_intval的秒和微妙都設爲0;
};
struct timeval {
long tv_sec; //表示秒
long tv_usec; //表示微妙
};
看完上面兩個結構體後,還需知道一個linux的信號函數signal(信號種類,函數); 本例中,定時器(因爲設定爲了ITIMER_REAL)時間到了會發出一個SIGALRM信號,接收到此信號,會引發函數動作
#include <stdio.h> #include <time.h> #include <sys/time.h> // 包含setitimer()函數 #include <stdlib.h> #include <signal.h> //包含signal()函數 static int count = 0; static struct itimerval oldtv; void set_timer() { struct itimerval itv; itv.it_interval.tv_sec = 1; 設置爲1秒 itv.it_interval.tv_usec = 0; itv.it_value.tv_sec = 1; itv.it_value.tv_usec = 0; setitimer(ITIMER_REAL, &itv, &oldtv); //此函數爲linux的api,不是c的標準庫函數 } void signal_handler(int m) { count ++; printf("%d\n", count); } int main() { signal(SIGALRM, signal_handler); //註冊當接收到SIGALRM時會發生是麼函數; set_timer(); //啓動定時器, while(count < 10000); exit(0); return 1; }
本文來自:Linux教程網