setitimer函数有两个功能,一个是指定某个时间之后执行某个信号处理函数,一个是指定间隔某个时间之后执行某个信号处理函数
函数原型:
int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);
ITIMER_REAL:以系统真实的时间来计算,它送出SIGALRM信号
ITIMER_VIRTUAL:以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号
ITIMER_PROF:以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号
new_value的类型为struct itimerval
struct itimerval { struct timeval it_interval; /* next value */ struct timeval it_value; /* current value */ }; struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ };it_value表示第一次产生SIGALRM信号的时间,定时器然后设置为it_interval,以后每隔这个时间产生一个SIGALRM信号
如下的示例程序:
#include <stdio.h> #include <unistd.h> #include <signal.h> #include <string.h> #include <stdlib.h> #include <sys/time.h> void print(int num) { fprintf(stderr,"hello, world\n"); } void main(int argc, char **argv) { signal(SIGALRM, print);//设置信号处理函数 struct itimerval tick; memset(&tick, 0, sizeof(tick)); tick.it_value.tv_sec = 4; tick.it_value.tv_usec = 0; tick.it_interval.tv_sec = 1; tick.it_interval.tv_usec = 0; int ret = setitimer(ITIMER_REAL, &tick, NULL); if(ret == -1) { fprintf(stderr,"setitimer error\n"); exit(-1); } for(;;) pause(); }
首先4秒后输出hello world,以后每隔1秒输出hello,world