zoukankan      html  css  js  c++  java
  • 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
    ", 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 }

    运行结果:

  • 相关阅读:
    洛谷 P1284 三角形牧场WD
    luogu P3817 小A的糖果
    P3374 【模板】树状数组 1
    线程与threading模块
    socketserver模块
    python 粘包问题及解决方法
    python 网络编程
    类的进阶四 反射和内置方法
    python hashlib模块 logging模块 subprocess模块
    类的进阶三
  • 原文地址:https://www.cnblogs.com/yongqiang/p/6132299.html
Copyright © 2011-2022 走看看