linux c 定時器

定時器是我們需要經常處理的一種資源。那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;  
}


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