setitimer

setitimer是一種函式。

基本介紹

  • 中文名:setitimer
  • 功能:使用alarm()和signal()
  • 套用系統:linux
  • 性質:函式
功能介紹,參數介紹,示例,

功能介紹

在linux下如果對定時要求不太精確的話,使用alarm()和signal()就行了,但是如果想要實現精度較高的定時功能的話,就要使用setitimer函式。

參數介紹

int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
which為定時器類型,setitimer支持3種類型的定時器:
ITIMER_REAL: 以系統真實的時間來計算,它送出SIGALRM信號。
ITIMER_VIRTUAL: -以該進程在用戶態下花費的時間來計算,它送出SIGVTALRM信號。
ITIMER_PROF: 以該進程在用戶態下和核心態下所費的時間來計算,它送出SIGPROF信號。
setitimer()第一個參數which指定定時器類型(上面三種之一);第二個參數是結構itimerval的一個實例;第三個參數可不做處理。
setitimer()調用成功返回0,否則返回-1。
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
struct timeval {
long tv_sec;
long tv_usec;
};
it_interval指定間隔時間,it_value指定初始定時時間。如果只指定it_value,就是實現一次定時;如果同時指定 it_interval,則逾時後,系統會重新初始化it_value為it_interval,實現重複定時;兩者都清零,則會清除定時器
tv_sec提供秒級精度,tv_usec提供微秒級精度,以值大的為先,注意1s = 1000000us。
ovalue用來保存先前的值,常設為NULL。
如果是以setitimer提供的定時器來休眠,只需阻塞等待定時器信號就可以了。

示例

fflush(stdout);利用setitimer範例
在該例子中,每隔一秒發出一個SIGALRM,每隔0.5秒發出一個SIGVTALRM信號:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
int sec;
void sigroutine(int signo){
switch (signo){
case SIGALRM:
printf("Catch a signal -- SIGALRM \n");
signal(SIGALRM, sigroutine);
break;
case SIGVTALRM:
printf("Catch a signal -- SIGVTALRM \n");
signal(SIGVTALRM, sigroutine);
break;
}
return;
}
int main()
{
struct itimerval value, ovalue, value2; //(1)
sec = 5;
printf("process id is %d\n", getpid());
signal(SIGALRM, sigroutine);
signal(SIGVTALRM, sigroutine);
value.it_value.tv_sec = 1;
value.it_value.tv_usec = 0;
value.it_interval.tv_sec = 1;
value.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &value, &ovalue); //(2)
value2.it_value.tv_sec = 0;
value2.it_value.tv_usec = 500000;
value2.it_interval.tv_sec = 0;
value2.it_interval.tv_usec = 500000;
setitimer(ITIMER_VIRTUAL, &value2, &ovalue);
for(;;)
;
}

相關詞條

熱門詞條

聯絡我們