setitimer设置定时器测试---1

时间:2022-08-06 23:30:22
/*我们在使用signal和时钟相关的结构体之前,需要包含这两个头文件*/
#include <signal.h>
#include <sys/time.h>

/*声明信号处理函数,这个函数是在进程收到信号的时候调用就可以了*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void sig_handler(int signo);
long lastsec,countsec; /*这两个变量分别用来保存上一秒的时间和总共花去的时间*/
int main(void)
{
struct itimerval v; /*定时器结构体*/
long nowsec,nowusec; /*当前时间的秒数和微秒数*/
/*注册SIGUSR1和SIGALARM信号的处理函数为sig_handler*/
if(signal(SIGUSR1,sig_handler)==SIG_ERR)
{
printf("Unable to create handler for SIGUSR1\n");
exit(0);
}
if(signal(SIGALRM,sig_handler)==SIG_ERR)
{
printf("Unable to create handler for SIGALRM\n");
exit(0);
}
/*初始化定时器初值和当前值*/
v.it_interval.tv_sec=9;
v.it_interval.tv_usec=999999;/* next value */
v.it_value.tv_sec=9;
v.it_value.tv_usec=999999;/* current value */

/*调用setitimer设置定时器,并将其挂到定时器链表上,这个函数的三个参数的含义分
别是设置ITIMER_REAL类型的定时器,要设置的值存放在变量v中,该定时器设置前
的值在设置后保存的地址,如果是这个参数为NULL,那么就放弃保存设置前的值*/
setitimer(ITIMER_REAL,&v,NULL);
lastsec = v.it_value.tv_sec;
countsec = 0;
/*该循环首先调用getitimer读取定时器当前值,再与原来的秒数比较,当发现已经过了
一秒后产生一个SIGUSR1信号,程序就会进入上面注册过的信号处理函数*/
while(1)
{
getitimer(ITIMER_REAL,&v);
nowsec = v.it_value.tv_sec;
nowusec = v.it_value.tv_usec;
if(nowsec == lastsec-1)
{
/*每过一秒,产生一个SIGUSR1信号*/
raise(SIGUSR1);
lastsec=nowsec;
countsec++; /*记录总的秒数*/
}
}
return 0;
}
/*信号处理函数*/
static void sig_handler(int signo)
{
switch(signo)
{
/*接收到的信号是SIGUSR1,打印One second passed*/
case SIGUSR1:
printf("One second passed\n");
break;
/*定时器定时到达*/
case SIGALRM:
{
printf("Timer has been zero,elapsed %d seconds\n",countsec);
lastsec = countsec;
countsec = 0;
break;
}
}
}