Linux系统编程-setitimer函数
功能:linux系统编程中,setitimer是一个经常被使用的函数,可用来实现延时和定时的功能。
头文件:sys/time.h
函数原型:
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
参数含义:
1、which参数用来设置定时器类型,可选的值为
(1)ITIMER_REAL : 设置定时器以系统真实所花费的时间来计时,运行指定时间后发送SIGALRM信号。
(2)ITIMER_VIRTUAL : 设置进程在用户空间中执行时,时间计数减少。运行指定时间后发送SIGVTALRM信号
(3)ITIMER_PROF : 设置进程在内核空间中执行时,时间计数减少。运行指定时间后发送SIGPROF信号。
2、new_value参数 : 用来对定时器的定时时间进行设置
3、old_value参数 :很少使用,常常设置为NULL。它是用来存储上一次setitimer调用时设置的new_value值。
itimerval结构体:
struct timeval { time_t tv_sec; /* 秒*/ suseconds_t tv_usec; /* 微秒(10^(-6))*/ }; struct itimerval { struct timeval it_interval; /* 再次产生定时器信号的时间 */ struct timeval it_value; /* 首次产生定时器信号的时间 */ };
settimer的机制:先对it_value以which参数设置的方式倒计时,当it_value为零时就会发送信号。然后it_value会被重置为it_interval的值。最后重新开始新一轮的定时,按照这种方式一直循环下去。
注意:
1、it_value的值为0,将不会发送信号。因此要想能发送信号,it_value的值得大于0
2、it_interval的值为0,定时器只会发送一次信号,即只能延时,不能定时。
demo程序:
1 #include <stdio.h> 2 #include <sys/time.h> 3 #include <unistd.h> 4 #include <stdlib.h> 5 #include <string.h> 6 #include <signal.h> 7 8 void call_back(int sig) 9 { 10 static int count = 1; 11 printf("call_back : %d\n", count++); 12 } 13 14 int main(void) 15 { 16 signal(SIGALRM, call_back); 17 struct itimerval new_value; 18 memset(&new_value, 0, sizeof(new_value)); 19 20 new_value.it_interval.tv_sec = 1; //设置再次定时时间为1S 21 new_value.it_interval.tv_usec = 0; 22 new_value.it_value.tv_sec = 2; //设置首次定时时间为2S 23 new_value.it_value.tv_usec = 0; 24 25 int ret = setitimer(ITIMER_REAL, &new_value, NULL); 26 if (0 != ret) 27 { 28 perror("setitimer"); 29 exit(-1); 30 } 31 getchar(); 32 33 return 0; 34 }
运行结果: