zoukankan      html  css  js  c++  java
  • setitimer()函数

    定时器时间函数

    struct itimerval:
    
          struct itimerval *new_value,其定义如下:
    
    struct itimerval {
    
    struct timeval it_interval;  /*next value*/
    
    struct timeval it_value; /*current value*/
    
    };
    
    struct timeval {
    
    long tv_sec; /*seconds*/
    
    lonng tv_usec /*microseconds*/
    
    };

    和alarm函数类是,用于定时操作。

    函数原型为

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

    其中which参数表示类型,可选的值有: 

    1. ITIMER_REAL:以系统真实的时间来计算,它送出SIGALRM信号。 
    2. ITIMER_VIRTUAL:以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。
    3. ITIMER_PROF:以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。

    old_value的值一般为NULL。

    settimer工作机制是,先对it_value倒计时,当it_value为零时触发信号,然后重置为it_interval,继续对it_value倒计时,一直这样循环下去。

    /***
    setitimer.c
    ***/
    #include<stdio.h>
    #include<stdlib.h>
    #include<sys/time.h>
    #include<signal.h>
    
    void myfunc(int signo)
    {
        puts("hello world.");
    }
    
    int main()
    {
        struct itimerval it,oldit;
        signal(SIGALRM,myfunc);
    
        it.it_value.tv_sec = 5;
        it.it_value.tv_usec = 0;
    
        it.it_interval.tv_sec = 3;
        it.it_interval.tv_usec = 0;
    
        if(setitimer(ITIMER_REAL,&it,&oldit) == -1)
        {
            perror("setitimer error ");
            exit(1);
        }
    
        while(1);
        return 0;
    }

    运行结果:

    root@ubuntu:/mnt/hgfs/ShareWindows/shiyanlou/C/Flappy_Bird# gcc setitimer.c -o setitimer

    root@ubuntu:/mnt/hgfs/ShareWindows/shiyanlou/C/Flappy_Bird# ./setitimer

    hello world.

    hello world.

    hello world.

    hello world.

    hello world.

    hello world.

    ^C

    执行之后,间隔5秒之后打印hello,world。然后在间隔三秒打印,后续的都是间隔3秒。

    这里我们知道:new_value.it_interval是用来控制第一次定时时长,new_value.it_value是用来定时后续定时的时长,并且是程序不死就连续定时(即,信号被我们捕捉,不执行默认动作了)。

    如果想知道定时器还有多久定到时间,再次调用setitimer函数,取出old_value可查看。

  • 相关阅读:
    成为Java GC专家系列(3) — 如何优化Java垃圾回收机制
    成为JavaGC专家Part II — 如何监控Java垃圾回收机制
    JAVA缓存的实现
    Lock Less Java Object Pool
    跟屌丝大哥学习设计模式--享元模式
    数据库 -- 由数据库连接池引出的三种设计模式
    优秀博客推荐:各种数据结构与算法知识入门经典
    学习总结
    洛谷P3360偷天换日(树形DP)
    疯子的算法总结14--ST算法(区间最值)
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11577919.html
Copyright © 2011-2022 走看看