zoukankan      html  css  js  c++  java
  • Linux下的定时器

    1.alarm()运行后,进程将继续运行。在后期(alarm以后)的运行过程中将会在seconds秒后收到信号SIGALRM并运行其处理函数。

    #include <stdio.h>
    #include <unistd.h>
    #include <signal.h>
    void sigalrm_fn(int sig)
    {
        printf("alarm!
    ");
        alarm(2);
        return;
    }
    int main(void)
    {
        signal(SIGALRM, sigalrm_fn);
        alarm(1);
        while(1) pause();
    }

    2.alarm定时器,可是仅仅能精确到秒,然而我们假设须要用到更精准的定时器能够用setitimer
     int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
     setitimer()比alarm功能强大,支持3种类型的定时器:
        ITIMER_REAL :     以系统真实的时间来计算。它送出SIGALRM信号。
        ITIMER_VIRTUAL : -以该进程在用户态下花费的时间来计算。它送出SIGVTALRM信号。
        ITIMER_PROF :     以该进程在用户态下和内核态下所费的时间来计算。它送出SIGPROF信号。
        setitimer()第一个參数which指定定时器类型(上面三种之中的一个)。第二个參数是结构itimerval的一个实例;第三个參数可不做处理。


        setitimer()调用成功返回0。否则返回-1。

        以下是关于setitimer调用的一个简单示范,在该样例中,每隔一秒发出一个SIGALRM。每隔0.5秒发出一个SIGVTALRM信号:[code=C/C++]

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <signal.h>
    #include <time.h>
    #include <sys/time.h>
    int sec;
    void sigroutine(int signo){
        switch (signo){
            case SIGALRM:
                printf("Catch a signal -- SIGALRM 
    ");
                signal(SIGALRM, sigroutine);
                break;
            case SIGVTALRM:
                printf("Catch a signal -- SIGVTALRM 
    ");
                signal(SIGVTALRM, sigroutine);
                break;
        }
        return;
    }
    int main()
    {
        struct itimerval value, ovalue, value2;          
        sec = 5;
        printf("process id is %d
    ", getpid());
        signal(SIGALRM, sigroutine);
        signal(SIGVTALRM, sigroutine);
        value.it_value.tv_sec = 1;
        value.it_value.tv_usec = 0;
        value.it_interval.tv_sec = 1;
        value.it_interval.tv_usec = 0;
        setitimer(ITIMER_REAL, &value, &ovalue); 
        value2.it_value.tv_sec = 0;
        value2.it_value.tv_usec = 500000;
        value2.it_interval.tv_sec = 0;
        value2.it_interval.tv_usec = 500000;
        setitimer(ITIMER_VIRTUAL, &value2, &ovalue);
        for(;;)
            ;
    }
    setitimer不会引起线程的堵塞、也不会引起线程的切换动作,就是简单的启动一个定时器,開始定时。并且这样的定时应该是基于内核的。(windwos的settimer是基于一种消息的模型)。setitimer尽管有三种类型ITIMER_REAL,ITIMER_VIRTUAL ITIMER_PROF,可是在同一时间同一进程。一种类型的仅仅能有1个setitimer。


  • 相关阅读:
    《0908-构建之法:现代软件工程-阅读笔记》
    配置fabric-crashlytics教程
    iOS开发工具——统计Crash的工具Crashlytics
    Overview of iOS Crash Reporting Tools: Part 2/2
    Overview of iOS Crash Reporting Tools: Part 1/2
    添加自签发的 SSL 证书为受信任的根证书
    UIWebView to view self signed websites (No private api, not NSURLConnection)
    Has anybody found a way to load HTTPS pages with an invalid server certificate using UIWebView?
    AFNetworking 2.0 Tutorial
    USING CHARLES FROM AN IPHONE
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6939454.html
Copyright © 2011-2022 走看看