使用setitimer和signal创建一个计时器

无聊之中,学习了一下setitimer函数的使用,整理一下,做个记录。

getitimer,setitimer - get or set value of an interval timer,man的第一句话是这样写的。其中的用法写的很详细了。

函数原型: setitimer(int which,const struct itimerval *value,struct itimerval *ovalue)

  • 参数一表示了计时器的类别,共分3种

<!---摘自网络

ITIMER_REAL:减少实际时间.到时的时候发出SIGALRM信号。

ITIMER_VIRTUAL:减少有效时间(进程执行的时间).产生SIGVTALRM信号。

ITIMER_PROF:减少进程的有效时间和系统时间(为进程调度用的时间)。这个经常和上面一个使用用来计算系统内核时间 和用户时间.产生SIGPROF信号。

-------------->

  • 参数二是itimerval结构指针,对于itimerval我们需要定义
  • itimerval.it_value.tv_sec,

    itimerval.it_value.tv_usec,

    itimerval.it_interval.tv_sec,

    itimerval.it_interval.tv_usec,

分别表示了第一次执行时间,单位s;第一次执行时间,单位ms;间隔时间,单位s,间隔时间,单位ms。

计时器是递减的,时间到零后触发signal。下边的小程序运行5s后输出第一个hello!!,以后每隔一秒输出一次hello!!

供大家参考
timer.h

#ifndef TIMER_H
#define TIMER_H

struct itimerval tval;
void settimer(unsigned int,unsigned int,unsigned int,unsigned int);
void msg();
void quite();
#endif

timer.c

#include 
  
#include 
  
#include 
  
#include 
  
#include 
  
#include "timer.h"

int main()
{
  settimer(5,0,1,0);
  signal(SIGALRM,msg);
  signal(SIGINT,quite);

  for(;;);
  return 0;
}

void msg()
{
  printf("hello world!!\n");
}
void quite()
{
  printf("received interrupt[CTRL+C] signal,exit process!\n");
  exit(0);
}
void settimer(unsigned int ue_sec,unsigned int ue_usec,unsigned int val_sec,unsigned int val_usec)
{
  int res=0;;
  memset(&tval,0,sizeof(tval));

  tval.it_value.tv_sec=ue_sec;
  tval.it_value.tv_usec=ue_usec;
  tval.it_interval.tv_sec=val_sec;
  tval.it_interval.tv_usec=val_usec;
  tval=tval;
  res=setitimer(ITIMER_REAL,&tval,NULL);
  if(res)
     {
    printf("set timer failed!\n");
    }
}

你可能感兴趣的:(c,职场,计时器,休闲)