Linux下的定时器

简介: 以下摘自linux下的man文件:(man  getitimer)   #include     int  getitimer(int which,  struct itimerval * curr_value);   int  setitimer(int which,  const struct itimerval  * new_value, struct itimerval  * old_value); 描述:   Linux系统中提供为每个进程提供了三个间隔定时器,在不同的时间域的每一个递减。

以下摘自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秒,再重新计数。

 1 #include <sys/time.h>
 2 #include <stdio.h>
 3 #include <unistd.h>
 4 #include <signal.h>
 5 #include <string.h>
 6 
10 //收到信号的回调函数
11 void prompt_info(int signo)
12 {
13     printf("hello world\n");
14 }
15 
16 //建立信号处理机制
17 void init_sigaction()
18 {
19     struct sigaction tact;
20     //本进程接收到信号要执行的处理函数prompt_info
21     tact.sa_handler = prompt_info;
22     tact.sa_flags   = 0;
23 
24     //初始化信号集
25     sigemptyset(&tact.sa_mask);
26 
27     //建立信号处理机制
28     sigaction(SIGALRM, &tact, NULL);
29 }
30 
31 void init_time()
32 {
33     //设定执行任务的时间间隔为2秒0微秒
34     struct itimerval value;
35     value.it_value.tv_sec  = 2;
36     value.it_value.tv_usec = 0;
37 
38     //设定初始时间计数也为2秒0微秒
39     value.it_interval = value.it_value;
40     
41     //设置计时器ITIMER_REAL
42     setitimer(ITIMER_REAL, &value, NULL);
43 }
44 
45 int main()
46 {48     init_sigaction();
49 
50     init_time();
51     while(1)
52         ;
53 
54     return 0;
55 }

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

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

而ITIMER_PROF对应SIGPROF。

 1 /*
 2  *通过自己计算时间差的方法来定时
 3  *获得精确计算时间差,把time 函数换成gettimeofday
 4  */
 5 
 6 #include <signal.h>
 7 #include <string.h>
 8 #include <unistd.h>
 9 #include <time.h>
10 #include <stdio.h>
11 
12 static time_t lasttime;
13 
14 void show_msg(int signo)
15 {
16     printf("hello world\n");
17 }
18 
19 int main()
20 {
21     struct sigaction act;
22     union sigval tsval;
23     act.sa_handler = show_msg;
24     act.sa_flags = 0;
25         
26     sigemptyset(&act.sa_mask);
27     sigaction(50, &act, NULL);
28     time(&lasttime);
29         
30     while(1)
31     {   
32         time_t nowtime;
33         //获取当前时间
34         time(&nowtime);
35 
36         if(nowtime-lasttime>=2)
37         {
38             sigqueue(getpid(), 50, tsval);
39             lasttime = nowtime;
40         }
41     }
42 
43     return 0;
44 }

 

相关文章
|
7月前
|
Shell Apache
77Linux - crontab定时器
77Linux - crontab定时器
27 0
|
2月前
|
监控 Linux 编译器
Linux C++ 定时器任务接口深度解析: 从理论到实践
Linux C++ 定时器任务接口深度解析: 从理论到实践
92 2
|
8月前
|
Linux
手把手教你写Linux设备驱动---定时器(一)(基于友善之臂4412开发板)
手把手教你写Linux设备驱动---定时器(一)(基于友善之臂4412开发板)
86 0
|
8月前
|
Linux
Linux驱动中断与时间篇——高精度定时器hrtimer
Linux驱动中断与时间篇——高精度定时器hrtimer
|
8月前
|
Linux
Linux驱动中断与时间篇——低分辨率定时器
Linux驱动中断与时间篇——低分辨率定时器
|
存储 Linux 调度
Linux驱动开发——定时器
Linux驱动开发——定时器
140 0
Linux驱动开发——定时器
Linux定时器
内核中使用jiffies进行时间计数,计数的频率由HZ来决定
|
Linux 芯片
Linux系统中裸机定时器的基本原理
大家好,今天的话主要和大家聊一聊,如何使用定时器,完成精准的定时功能实现​。
138 0
Linux系统中裸机定时器的基本原理
|
编解码 安全 Linux
Linux内核开发基础-低精度timer_list和高精度hrtimer定时器
上篇文章讲解了如何正确的使用内核延时函数,在进行驱动开发时,可能会经常用到精确地延时操作。除此之外,如果要实现一个定时任务,那就需要用到定时器。作为一项基础功能需求,Linux内核提供了定时器相关的实现。下面就具体看一下,Linux内核所提供的定时器实现。
982 0
|
数据采集 前端开发 JavaScript
【Linux】好用的定时器
【Linux】好用的定时器
108 0
【Linux】好用的定时器