setitimer函数
结构如下:
#include <sys/time.h>
2
3 int setitimer(int which, const struct itimerval *new_value,
4 struct itimerval *old_value);
5
6 Timer values are defined by the following structures:
7
8 struct itimerval {
9 struct timeval it_interval; /* next value */
10 struct timeval it_value; /* current value */
11 };
12
13 struct timeval {
14 time_t tv_sec; /* seconds */
15 suseconds_t tv_usec; /* microseconds */
16 };
setitimer()为Linux的API,并非C语言的Standard Library,setitimer()有两个功能,一是指定一段时间后,才执行某个function,二是每间格一段时间就执行某个function;
Linux为每个任务安排了3个内部定时器:
ITIMER_REAL:实时定时器,不管进程在何种模式下运行(甚至在进程被挂起时),它总在计数。定时到达,向进程发送SIGALRM信号。
ITIMER_VIRTUAL:这个不是实时定时器,当进程在用户模式(即程序执行时)计算进程执行的时间。定时到达后向该进程发送SIGVTALRM信号。
ITIMER_PROF:进程在用户模式(即程序执行时)和核心模式(即进程调度用时)均计数。定时到达产生SIGPROF信号。ITIMER_PROF记录的时间比ITIMER_VIRTUAL多了进程调度所花的时间。
定时器在初始化是,被赋予一个初始值,随时间递减,递减至0后发出信号,同时恢复初始值。在任务中,我们可以一种或者全部三种定时器,但同一时刻同一类型的定时器只能使用一个。
使用itimer的定时器
it_interval用来指定时间间隔, it_value用来保存当前时间离执行任务还有多长时间,它是会自动变化的变量。比如说, 你指定it_interval为2秒(微秒为0),开始的时候我们把it_value的时间也设定为2秒(微秒为0),当过了一秒, it_value就减少一个为1, 再过1秒,则it_value又减少1,变为0,这个时候发出信号(告诉用户时间到了,可以执行任务了),并且系统自动把it_value的时间重置为 it_interval的值,即2秒,再重新计数。
#include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <signal.h>
5 #include <sys/time.h>
6
7 void handler()
8 {
9 static count = 0;
10
11 printf("count is %d\n", count++);
12 }
13
14 void init_sigaction()
15 {
16 struct sigaction act;
17
18 act.sa_handler = handler; //设置处理信号的函数
19 act.sa_flags = 0;
20
21 sigemptyset(&act.sa_mask);
22 sigaction(SIGPROF, &act, NULL);//时间到发送SIGROF信号
23 }
24
25 void init_time()
26 {
27 struct itimerval val;
28
29 val.it_value.tv_sec = 1; //1秒后启用定时器
30 val.it_value.tv_usec = 0;
31
32 val.it_interval = val.it_value; //定时器间隔为1s
33
34 setitimer(ITIMER_PROF, &val, NULL);
35 }
36
37 int main(int argc, char **argv)
38 {
39
40 init_sigaction();
41 init_time();
42
43 while(1);
44
45 return 0;
46 }
注意
handler任务函数只能是返回值为void类型的静态函数,因此,他不能是一个类的普通成员函数。