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

来源:互联网 发布:淘宝客需要什么软件 编辑:程序博客网 时间:2024/06/05 03:44
/*我们在使用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;                      }          }}

0 0
原创粉丝点击