定時器是咱們須要常常處理的一種資源。那linux下面的定時器又是怎麼一回事呢?其實,在linux裏面有一種進程中信息傳遞的方法,那就是信號。這裏的定時器就至關於系統每隔一段時間給進程發一個定時信號,咱們所要作的就是定義一個信號處理函數。linux
在這以前,先看linux中定義好的一個結構體:struct itimerval;api
struct itimerval {//結構體中又包含結構體timeval函數
struct timeval it_interval;//表示時間間隔,包括秒和微妙教程
struct timeval it_value; //表示第一次定的時間,也包括秒和微妙, 這個時間爲0後,會把上一個時間賦給他,已達到循環的目的,若是進程
//不需循環,則it_intval的秒和微妙都設爲0;資源
};get
struct timeval {it
long tv_sec; //表示秒io
long tv_usec; //表示微妙class
};
看完上面兩個結構體後,還需知道一個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; }