使用信号实现定时器程序
通过对itimerval结构体变量参数的设置实现倒计时发送信号触发功能或者间隔时间发送信号功能
头文件:#include <sys/time.h>
函数原型:int setitimer(int which , const struct itimer)val *new_value , struct itimerval *old_value); /* which类型:ITIMER_REAL(系统真实时间计算,送出SIGALRM信号) , ITIMER_VIRTUAL(以该进程在用户态下花费的时间计算,发送出SIGPROF信号) , ITIMER_PROF(以该进程在用户态下和内核态下所费的时间计算 , 发送出SIGPROF信号) , old_value 用来存储上一次setitimer时的new_value值 */
itimerval结构体:
struct timeval {
time_t tv_sec; //秒为单位的时常
suseconds_t tv_usec; //微秒为单位的市场,都不为零则选取大?小?的
};
struct itimerval {
struct timeval it_interval; //一次it_value时常倒计时结束发送信号后,将it_interval的值置到it_value中,继续下一次倒计时,循环;如果为0则可理解为将0重置到it_value中,停止倒计时循环
struct timeval it_value; //第一次倒计时的时间,结束后发送信号,并从it_interval中取值重置循环倒计时
};
demo:
//timer.c
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <stdlib.h>
#include <signal.h>
//#include <system.h>
static int count = 0;
static struct itimerval oldtv;
void set_timer()
{
struct itimerval itv;
itv.it_interval.tv_sec = 1;
itv.it_interval.tv_usec = 0;
itv.it_value.tv_sec = 10;
itv.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &itv , &oldtv);
}
void signal_handler(int m)
{
count ++;
printf("%d\n", count);
}
int main()
{
signal(SIGALRM , signal_handler);
set_timer();
while(count < 12);
exit(0);
return 1;
}