1. 程式人生 > >linux下定時器setitimer的使用

linux下定時器setitimer的使用

1,下面為setitimer函式引數:
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));

第一個引數int switch為設定定時器型別:
ITIMER_REAL : 以系統真實的時間來計算,它送出SIGALRM訊號。  
 ITIMER_VIRTUAL : -以該程序在使用者態下花費的時間來計算,它送出SIGVTALRM 訊號。  
 ITIMER_PROF : 以該程序在使用者態下和核心態下所費的時間來計算,它送出SIGPROF訊號。

第二個引數為設定定時器響應時間,兩個結構體。
1,  struct itimerval {
  struct timeval it_interval;
  struct timeval it_value;
  };
  
2、   struct timeval {
  long tv_sec;
  long tv_usec;
  };

struct timeval it_value; 設定定時器初始響應時間,若只定義這個,則定時器只跑一次停止。
struct timeval it_interval;設定定時器每隔多久就響應得時間。
若想關閉定時器,則將兩個結構體資料都清零即可。

第三個引數可設定為空NULL。

2,一個簡單使用demo,用於定時器只進行一次響應。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <sys/time.h>
static int count = 0; #define SEC 1 #define USEC 0 void timeout(int signal) { printf("Get a SIGALRM, counts = %d!\n",count); } int on_timer() { struct itimerval tick; memset(&tick, 0, sizeof(tick)); tick.it_value.tv_sec = SEC; tick.it_value.tv_usec = USEC; tick.it_interval.tv_sec = 0
; tick.it_interval.tv_usec = 0; if(setitimer(ITIMER_REAL, &tick, NULL) < 0) printf("Set timer failed!\n"); return 0; } int off_timer() { struct itimerval tick; memset(&tick, 0, sizeof(tick)); tick.it_value.tv_sec = 0; tick.it_value.tv_usec = 0; tick.it_interval.tv_sec = 0; tick.it_interval.tv_usec = 0; if(setitimer(ITIMER_REAL, &tick, NULL) < 0) printf("Set timer failed!\n"); return 0; } void *func(void *arg) { while(1) { printf("hello...\n"); count ++; if(count%2 == 0) { on_timer(); sleep(2); } else off_timer(); } } int main() { int res = 0; signal(SIGALRM, timeout); on_timer(); pthread_t fd; pthread_create(&fd,NULL,func,NULL); while(1) { sleep(20); } return 0; }