Linux系统编程-setitimer函数

Posted Linux C/C++程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统编程-setitimer函数相关的知识,希望对你有一定的参考价值。

功能:linux系统编程中,setitimer是一个经常被使用的函数,可用来实现延时和定时的功能。

 

头文件:sys/time.h

 

函数原型:

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

 

参数含义:

1、which参数用来设置定时器类型,可选的值为

  (1)ITIMER_REAL : 设置定时器以系统真实所花费的时间来计时,运行指定时间后发送SIGALRM信号。

  (2)ITIMER_VIRTUAL : 设置进程在用户空间中执行时,时间计数减少。运行指定时间后发送SIGVTALRM信号

  (3)ITIMER_PROF : 设置进程在内核空间中执行时,时间计数减少。运行指定时间后发送SIGPROF信号。

2、new_value参数 : 用来对定时器的定时时间进行设置

3、old_value参数 :很少使用,常常设置为NULL。它是用来存储上一次setitimer调用时设置的new_value值。

 

itimerval结构体:

struct timeval
{
    time_t      tv_sec;          /**/
    suseconds_t tv_usec;     /* 微秒(10^(-6))*/
};
 
struct itimerval
{
    struct timeval it_interval; /* 再次产生定时器信号的时间 */
    struct timeval it_value;    /* 首次产生定时器信号的时间 */
};

 

settimer的机制:先对it_value以which参数设置的方式倒计时,当it_value为零时就会发送信号。然后it_value会被重置为it_interval的值。最后重新开始新一轮的定时,按照这种方式一直循环下去。

 

注意:

1、it_value的值为0,将不会发送信号。因此要想能发送信号,it_value的值得大于0

2、it_interval的值为0,定时器只会发送一次信号,即只能延时,不能定时。

 

demo程序:

 1 #include <stdio.h>
 2 #include <sys/time.h>
 3 #include <unistd.h>
 4 #include <stdlib.h>
 5 #include <string.h>
 6 #include <signal.h>
 7 
 8 void call_back(int sig)
 9 {
10     static int count = 1;
11     printf("call_back : %d\\n", count++);
12 }
13 
14 int main(void)
15 {
16     signal(SIGALRM, call_back);
17     struct itimerval new_value;
18     memset(&new_value, 0, sizeof(new_value));
19 
20     new_value.it_interval.tv_sec = 1;   //设置再次定时时间为1S
21     new_value.it_interval.tv_usec = 0;
22     new_value.it_value.tv_sec = 2;      //设置首次定时时间为2S
23     new_value.it_value.tv_usec = 0;
24 
25     int ret = setitimer(ITIMER_REAL, &new_value, NULL);
26     if (0 != ret)
27     {
28         perror("setitimer");
29         exit(-1);
30     }
31     getchar();
32 
33     return 0;
34 }

 

运行结果:

以上是关于Linux系统编程-setitimer函数的主要内容,如果未能解决你的问题,请参考以下文章

Linux时间子系统之四:Timer在用户和内核空间流程

linux高编信号-------setitimer()getitimer()

信号的发送kill,raise,alarm,setitimer,abort,sigqueue

linux打开终端如何启动scala,如何在终端下运行Scala代码片段?

实验七 信号

linux 进程通信之 信号