剛好寫(xiě)程序的時(shí)候要使用定時(shí)器,就是定時(shí)的做一些操作,網(wǎng)上查了一下,自己也學(xué)著寫(xiě)了寫(xiě),網(wǎng)上倒是說(shuō)的好多種,我在這里就不做過(guò)多介紹了,就說(shuō)我用的這個(gè),使用
setitimer函數(shù)。
函數(shù)原型
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
參數(shù)說(shuō)明
參數(shù)which
參數(shù) which是定時(shí)器類型
取值
|
含義
|
信號(hào)發(fā)送
|
ITIMER_REAL
|
定時(shí)真實(shí)時(shí)間,與alarm類型相同。
|
SIGALRM
|
ITIMER_VIRT
|
定時(shí)進(jìn)程在用戶態(tài)下的實(shí)際執(zhí)行時(shí)間。
|
SIGVTALRM
|
ITIMER_PROF
|
定時(shí)進(jìn)程在用戶態(tài)和核心態(tài)下 的實(shí)際執(zhí)行時(shí)間。
|
SIGPROF
|
這三種定時(shí)器定時(shí)完成時(shí)給進(jìn)程發(fā)送的信號(hào)各不相同,其中ITIMER_REAL類定時(shí)器發(fā)送SIGALRM信號(hào),ITIMER_VIRT類定時(shí)器發(fā)送SIGVTALRM信號(hào),ITIMER_PROF類定時(shí)器發(fā)送SIGPROF信號(hào)。
參數(shù) value
結(jié)構(gòu)itimerval描述了定時(shí)器的組成。
1 struct itimerval
2 {
3 struct timeval it_interval; /* 下次定時(shí)取值 */
4 struct timeval it_value; /* 本次定時(shí)設(shè)置值 */
5 }
6
結(jié)構(gòu)timeval描述的是精確到微秒的結(jié)構(gòu)。
1 struct timeval
2 {
3 long tv_sec; /* 秒(1000000微秒) */
4 long tv_usec; /* 微妙 */
5 }
6
itimerval結(jié)構(gòu)中的it_value是代表首次定時(shí)的時(shí)間,而it_interval代表下一次定時(shí)的時(shí)間,執(zhí)行完第一次之后,it_interval中的時(shí)間會(huì)賦值給it_value,周而復(fù)始。如果it_value值被設(shè)置為0,則定時(shí)器停止定時(shí);如果it_value值不為0但it_interval值為0,則定時(shí)器在一次定時(shí)后終止。
setitimer執(zhí)行成功返回0,否則返回-1
參數(shù)ovalue
該參數(shù)可以使用空值NULL,如果不為空的話,返回的是上一個(gè)時(shí)刻的定時(shí)器狀態(tài)。
下面寫(xiě)的一個(gè)簡(jiǎn)單的例子程序。
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <signal.h>
5 #include <time.h>
6 #include <sys/time.h>
7
8 int n=0;
9 void doAction(int sig)//你要做的事情
10 {
11 printf("讓一切痛苦隨風(fēng)而去 %d\n",n++);
12 signal(SIGALRM,doAction);
13 }
14 void setMyTimer(int val)
15 {
16 struct itimerval value;
17 value.it_value.tv_sec=val;
18 value.it_value.tv_usec=0;
19 value.it_interval.tv_sec=val; //val秒
20 value.it_interval.tv_usec=0;
21 signal(SIGALRM, doAction);
22 setitimer(ITIMER_REAL,&value,NULL);
23 while(1);
24 }
25
26 int main( int argc, char **argv )
27 {
28 if (argc<2)
29 {
30 printf("請(qǐng)您輸入?yún)?shù):\n");//第二個(gè)參數(shù)是定時(shí)器的時(shí)長(zhǎng)的,單位是秒
31 return -1;
32 }
33 int val=atoi(argv[1]);
34 printf("%d\n",val);
35 setMyTimer(val);
36 return 0;
37 }
代碼就不解釋了,就是啟動(dòng)的時(shí)候獲得第二個(gè)參數(shù),用作定時(shí)器的時(shí)間,然后打印出“讓一切痛苦隨風(fēng)去 0”,如此循環(huán)。
在AIX5.2下,使用XLC++V7.0編譯通過(guò)。
運(yùn)行效果如下