Linux 定時器setitimer()

 

Linux 定時器setitimer()

 

 

用法:
#include <sys/time.h>

int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);

 

功能描述:
獲取或設定間歇計時器的值。系統爲進程提供三種類型的計時器,每一類以不同的時間域遞減其值。當計時器超時,信號被髮送到進程,之後計時器重啓動。

 
參數:
which:間歇計時器類型,有三種選擇

ITIMER_REAL //數值爲0,以系統真實的時間來計算,發送的信號是SIGALRM。
ITIMER_VIRTUAL //數值爲1,以該進程在用戶態下花費的時間來計算,發送的信號是SIGVTALRM。
ITIMER_PROF //數值爲2, 以該進程在用戶態下和內核態下所費的時間來計算,發送的信號是SIGPROF。

 

value,ovalue:時間參數,原型如下

struct itimerval {
    struct timeval it_interval;
    struct timeval it_value;   
};

struct timeval {
    long tv_sec;               
    long tv_usec;              
};

    itimerval結構中的it_value是減少的時間,當這個值爲0的時候就發出相應的信號了. 然後再將it_value設置爲it_interval值. 也就是先處理it_value中設置的值,爲0後發送信號(根據which來判斷髮送什麼信號),之後都是根據it_interval的值發送信號。若 it_value爲0,就沒有相應的信號產生了。

 

getitimer()用計時器的當前值填寫value指向的結構體。
setitimer()將 value 指向的結構體設爲計時器的當前值,如果ovalue不是NULL,將返回計時器原有值。


返回說明:
成功執行時,返回0。失敗返回-1,errno被設爲以下的某個值
EFAULT:value 或ovalue是不有效的指針
EINVAL:其值不是ITIMER_REAL,ITIMER_VIRTUAL 或 ITIMER_PROF之一

 

例子:
void sigroutine(int signo)
{
 static int count1=0,count2=0;

 switch (signo)
 {
 case SIGALRM:
  count1++;
  printf("Catch a signal -- SIGALRM \n");
  printf("count1 = %d\n\n", count1);
  signal(SIGALRM, sigroutine);
  break;
 case SIGVTALRM:
  count2++;
  printf("Catch a signal -- SIGVTALRM \n");
  printf("count2 = %d\n\n", count2);
  signal(SIGVTALRM, sigroutine);
  break;
 }
 return;
}

 

int main()
{
 struct itimerval value, ovalue, value2;
 printf("process id is %d\n", getpid());

 signal(SIGALRM, sigroutine);
 signal(SIGVTALRM, sigroutine);

 

 value.it_value.tv_sec = 2;
 value.it_value.tv_usec = 0;
 value.it_interval.tv_sec = 3;
 value.it_interval.tv_usec = 0;
 setitimer(ITIMER_REAL, &value, &ovalue);

 

 value2.it_value.tv_sec = 1;
 value2.it_value.tv_usec = 0;
 value2.it_interval.tv_sec = 3;
 value2.it_interval.tv_usec = 0;
 setitimer(ITIMER_VIRTUAL, &value2, &ovalue);

 

 while(1);
}

 

發佈了11 篇原創文章 · 獲贊 29 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章