定時器時間函數
struct itimerval:struct itimerval *new_value,其定義如下:struct itimerval {struct timeval it_interval; /*next value*/struct timeval it_value; /*current value*/};struct timeval {long tv_sec; /*seconds*/lonng tv_usec /*microseconds*/};
?
和alarm函數類是,用于定時操作。
函數原型為
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
其中which參數表示類型,可選的值有:?
- ITIMER_REAL:以系統真實的時間來計算,它送出SIGALRM信號。?
- ITIMER_VIRTUAL:以該進程在用戶態下花費的時間來計算,它送出SIGVTALRM信號。
- ITIMER_PROF:以該進程在用戶態下和內核態下所費的時間來計算,它送出SIGPROF信號。
old_value的值一般為NULL。
settimer工作機制是,先對it_value倒計時,當it_value為零時觸發信號,然后重置為it_interval,繼續對it_value倒計時,一直這樣循環下去。
/*** setitimer.c ***/ #include<stdio.h> #include<stdlib.h> #include<sys/time.h> #include<signal.h>void myfunc(int signo) {puts("hello world."); }int main() {struct itimerval it,oldit;signal(SIGALRM,myfunc);it.it_value.tv_sec = 5;it.it_value.tv_usec = 0;it.it_interval.tv_sec = 3;it.it_interval.tv_usec = 0;if(setitimer(ITIMER_REAL,&it,&oldit) == -1){perror("setitimer error ");exit(1);}while(1);return 0; }
運行結果:
root@ubuntu:/mnt/hgfs/ShareWindows/shiyanlou/C/Flappy_Bird# gcc setitimer.c -o setitimer
root@ubuntu:/mnt/hgfs/ShareWindows/shiyanlou/C/Flappy_Bird# ./setitimer
hello world.
hello world.
hello world.
hello world.
hello world.
hello world.
^C
執行之后,間隔5秒之后打印hello,world。然后在間隔三秒打印,后續的都是間隔3秒。
?
這里我們知道:new_value.it_interval是用來控制第一次定時時長,new_value.it_value是用來定時后續定時的時長,并且是程序不死就連續定時(即,信號被我們捕捉,不執行默認動作了)。
?
如果想知道定時器還有多久定到時間,再次調用setitimer函數,取出old_value可查看。
?