Linux下的定时器

时间:2021-09-27 11:13:53

以下摘自linux下的man文件:(man  getitimer)

  #include  <sys/time.h>

  int  getitimer(int which,  struct itimerval * curr_value);

  int  setitimer(int which,  const struct itimerval  * new_value, struct itimerval  * old_value);

描述:

  Linux系统中提供为每个进程提供了三个间隔定时器,在不同的时间域的每一个递减。

       当任何定时器超时,则发送一个信号到该过程,并在定时器(可能)重新启动。

  ITIMER_REAL: 实时递减,时间到发送SIGALRM信号;

  ITIMER_VIRTUAL:递减只有当进程正在执行,并且期满后可提供SIGVTALRM

  ITIMER_PROF: 当进程执行或者是系统为进程调度的时候,减少计数,时间到了,发出SIGPROF信号,这个和ITIMER_VIRTUAL联合,常用来计算系统内核时间和用户时间。

以下结果体中定义了定时器的值:

  struct itimerval

  {

    struct timerval it_interval;  //next value;

    struct timerval it_value;   //current value;

  };

  struct timeval

  {

    long tv_sec;   //seconds; 

    long tv_usec;  //microseconds;

  }

it_interval用来指定每隔多长时间执行任务, it_value用来保存当前时间离执行任务还有多长时间。比如说, 你指定it_interval为2秒(微秒为0),开始的时候我们把it_value的时间也设定为2秒(微秒为0),当过了一秒, it_value就减少一个为1, 再过1秒,则it_value又减少1,变为0,这个时候发出信号(告诉用户时间到了,可以执行任务了),并且系统自动把it_value的时间重置为 it_interval的值,即2秒,再重新计数。

 #include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h> //收到信号的回调函数
void prompt_info(int signo)
{
printf("hello world\n");
} //建立信号处理机制
void init_sigaction()
{
struct sigaction tact;
//本进程接收到信号要执行的处理函数prompt_info
tact.sa_handler = prompt_info;
tact.sa_flags = ; //初始化信号集
sigemptyset(&tact.sa_mask); //建立信号处理机制
sigaction(SIGALRM, &tact, NULL);
} void init_time()
{
//设定执行任务的时间间隔为2秒0微秒
struct itimerval value;
value.it_value.tv_sec = ;
value.it_value.tv_usec = ; //设定初始时间计数也为2秒0微秒
value.it_interval = value.it_value; //设置计时器ITIMER_REAL
setitimer(ITIMER_REAL, &value, NULL);
} int main()
{ init_sigaction(); init_time();
while()
; return ;
}

使用ITMER_REAL定时器,每隔2秒钟都会发送一个SIGALRM信号,当主函数接收到了这个信号之后,调用信号处理函数 prompt_info在输出time is running out这个字符串。

对于ITIMER_VIRTUAL和ITIMER_PROF的使用方法类似,在setitimer里面设置的定时器为 ITIMER_VIRTUAL的时候,并把sigaction里面的SIGALRM改为SIGVTALARM,

而ITIMER_PROF对应SIGPROF。

 /*
*通过自己计算时间差的方法来定时
*获得精确计算时间差,把time 函数换成gettimeofday
*/ #include <signal.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <stdio.h> static time_t lasttime; void show_msg(int signo)
{
printf("hello world\n");
} int main()
{
struct sigaction act;
union sigval tsval;
act.sa_handler = show_msg;
act.sa_flags = ; sigemptyset(&act.sa_mask);
sigaction(, &act, NULL);
time(&lasttime); while()
{
time_t nowtime;
//获取当前时间
time(&nowtime); if(nowtime-lasttime>=)
{
sigqueue(getpid(), , tsval);
lasttime = nowtime;
}
} return ;
}