Linux struct itimerval用法
阿新 • • 發佈:2019-01-24
先看一段程式碼
#include <stdio.h> #include <time.h> #include <sys/time.h> #include <stdlib.h> #include <signal.h> static int count = 0; void set_timer() { struct itimerval itv; itv.it_value.tv_sec = 3; //timer start after 3 seconds later itv.it_value.tv_usec = 0; itv.it_interval.tv_sec = 1; itv.it_interval.tv_usec = 0; setitimer(ITIMER_REAL,&itv,NULL); } void signal_handler(int m) { count ++; printf("%d\n",count); } int main() { signal(SIGALRM,signal_handler); set_timer(); while(count < 10); exit(0); return 0; }
這段程式碼實現的功能:3秒鐘後啟動定時器,然後每隔1秒鐘向終端列印count的遞增值,當count到10時程式退出。
結構體原型:
struct itimerval {
struct timeval it_interval; /* next value */
struct timeval it_value; /* current value */
};
即:struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ };
struct itimerval {
struct timeval it_interval; /* 計時器重啟動的間歇值 */
struct timeval it_value; /* 計時器安裝後首先啟動的初始值 */
};
struct timeval {
long tv_sec; /* 秒 */
long tv_usec; /* 微妙(1/1000000) */
};
再來看這個函式:
int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue);
setitimer()將value指向的結構體設為計時器的當前值,如果ovalue不是NULL,將返回計時器原有值。
which:間歇計時器型別,有三種選擇
ITIMER_REAL //數值為0,計時器的值實時遞減,傳送的訊號是SIGALRM。
ITIMER_VIRTUAL //數值為1,程序執行時遞減計時器的值,傳送的訊號是SIGVTALRM。
ITIMER_PROF //數值為2,程序和系統執行時都遞減計時器的值,傳送的訊號是SIGPROF。
返回說明:
成功執行時,返回0。失敗返回-1,errno被設為以下的某個值
EFAULT:value或ovalue是不有效的指標
EINVAL:其值不是ITIMER_REAL,ITIMER_VIRTUAL 或 ITIMER_PROF之一