使用setitimer和signal創建一個計時器

無聊之中,學習了一下setitimer函數的使用,整理一下,做個記錄。

getitimer,setitimer - get or set value of an interval timer,man的第一句話是這樣寫的。其中的用法寫的很詳細了。

函數原型: setitimer(int which,const struct itimerval *value,struct itimerval *ovalue)

  • 參數一表示了計時器的類別,共分3種

<!---摘自網絡

ITIMER_REAL:減少實際時間.到時的時候發出SIGALRM信號。

ITIMER_VIRTUAL:減少有效時間(進程執行的時間).產生SIGVTALRM信號。

ITIMER_PROF:減少進程的有效時間和系統時間(爲進程調度用的時間)。這個經常和上面一個使用用來計算系統內核時間 和用戶時間.產生SIGPROF信號。

-------------->

  • 參數二是itimerval結構指針,對於itimerval我們需要定義
  • itimerval.it_value.tv_sec,

    itimerval.it_value.tv_usec,

    itimerval.it_interval.tv_sec,

    itimerval.it_interval.tv_usec,

分別表示了第一次執行時間,單位s;第一次執行時間,單位ms;間隔時間,單位s,間隔時間,單位ms。

計時器是遞減的,時間到零後觸發signal。下邊的小程序運行5s後輸出第一個hello!!,以後每隔一秒輸出一次hello!!

供大家參考
timer.h

#ifndef TIMER_H
#define TIMER_H

struct itimerval tval;
void settimer(unsigned int,unsigned int,unsigned int,unsigned int);
void msg();
void quite();
#endif

timer.c

#include 
#include 
#include 
#include 
#include 
#include "timer.h"

int main()
{
  settimer(5,0,1,0);
  signal(SIGALRM,msg);
  signal(SIGINT,quite);

  for(;;);
  return 0;
}

void msg()
{
  printf("hello world!!\n");
}
void quite()
{
  printf("received interrupt[CTRL+C] signal,exit process!\n");
  exit(0);
}
void settimer(unsigned int ue_sec,unsigned int ue_usec,unsigned int val_sec,unsigned int val_usec)
{
  int res=0;;
  memset(&tval,0,sizeof(tval));

  tval.it_value.tv_sec=ue_sec;
  tval.it_value.tv_usec=ue_usec;
  tval.it_interval.tv_sec=val_sec;
  tval.it_interval.tv_usec=val_usec;
  tval=tval;
  res=setitimer(ITIMER_REAL,&tval,NULL);
  if(res)
     {
    printf("set timer failed!\n");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章