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
#include
#include
#include
#include
#include
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;
}
fflush(stdout);
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;
//(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(;;)
;
}
參考
alarm, gettimeofday, sigaction, signal, timer_create, timerfd_create, time, sleep, nanosleep, usleep