刚好写程序的时候要使用定时器,就是定时的做一些操作,网上查了一下,自己也学着写了写,网上倒是说的好多种,我在这里就不做过多介绍了,就说我用的这个,使用
setitimer函数。
函数原型
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
参数说明
参数which
参数 which是定时器类型
取值
|
含义
|
信号发送
|
ITIMER_REAL
|
定时真实时间,与alarm类型相同。
|
SIGALRM
|
ITIMER_VIRT
|
定时进程在用户态下的实际执行时间。
|
SIGVTALRM
|
ITIMER_PROF
|
定时进程在用户态和核心态下 的实际执行时间。
|
SIGPROF
|
这三种定时器定时完成时给进程发送的信号各不相同,其中ITIMER_REAL类定时器发送SIGALRM信号,ITIMER_VIRT类定时器发送SIGVTALRM信号,ITIMER_PROF类定时器发送SIGPROF信号。
参数 value
结构itimerval描述了定时器的组成。
1 struct itimerval
2 {
3 struct timeval it_interval; /* 下次定时取值 */
4 struct timeval it_value; /* 本次定时设置值 */
5 }
6
结构timeval描述的是精确到微秒的结构。
1 struct timeval
2 {
3 long tv_sec; /* 秒(1000000微秒) */
4 long tv_usec; /* 微妙 */
5 }
6
itimerval结构中的it_value是代表首次定时的时间,而it_interval代表下一次定时的时间,执行完第一次之后,it_interval中的时间会赋值给it_value,周而复始。如果it_value值被设置为0,则定时器停止定时;如果it_value值不为0但it_interval值为0,则定时器在一次定时后终止。
setitimer执行成功返回0,否则返回-1
参数ovalue
该参数可以使用空值NULL,如果不为空的话,返回的是上一个时刻的定时器状态。
下面写的一个简单的例子程序。
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("让一切痛苦随风而去 %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("请您输入参数:\n");//第二个参数是定时器的时长的,单位是秒
31 return -1;
32 }
33 int val=atoi(argv[1]);
34 printf("%d\n",val);
35 setMyTimer(val);
36 return 0;
37 }
代码就不解释了,就是启动的时候获得第二个参数,用作定时器的时间,然后打印出“让一切痛苦随风去 0”,如此循环。
在AIX5.2下,使用XLC++V7.0编译通过。
运行效果如下