• linux系统编程之信号(七)


    今天继续学习信号,主要是学习关于时间和定时器相关的函数的使用,关于这个实际上有很多内容,这里先简要进行说明,等之后再慢慢进行相关深入,也主要是为接下来要做的一个综合linux系统编程的例子做准备,好了,进入正题:

    三种不同精度的睡眠:
    关于这个函数,实际上已经在之前使用过了,具体可以参考博文:http://www.cnblogs.com/webor2006/p/3525517.html
    查看man帮助:
     
    以微秒为单位,那微秒跟秒是什么关系呢?
    1秒=10的3次方毫秒=10的6次方微妙
    以纳秒为单位的休眠
    三种时间结构:
    setitimer:
     
    查看一下man帮助,其中ittimerval结构体的内容如下:
     
     
    对于上面的描述可能比较抽象,下面以实际例子来进行说明:
    #include <unistd.h>
    #include <sys/stat.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    #include <fcntl.h>
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <signal.h>
    #include <sys/time.h>//另外需要包含头文件
    
    
    #define ERR_EXIT(m) 
        do 
        { 
            perror(m); 
            exit(EXIT_FAILURE); 
        } while(0)
    
    void handler(int sig)
    {
        printf("recv a sig=%d
    ", sig);
    }
    
    int main(int argc, char *argv[])
    {
        if (signal(SIGALRM, handler) == SIG_ERR)//注册一个SIGALRM信号
            ERR_EXIT("signal error");
    
        struct timeval tv_interval = {1, 0};
        struct timeval tv_value = {5, 0};//那这两个值有什么意义呢?
        struct itimerval it;
        it.it_interval = tv_interval;
        it.it_value = tv_value;
        setitimer(ITIMER_REAL, &it, NULL);//这个函数会间接性地产生SIGALRM信号,需传递ITIMER_REAL参数
    
        for (;;)
            pause();
        return 0;
    }

    编译运行:

    从运行结果可以知道,等待五秒钟之后才打印出来,以后每过一秒打印,那再回过头来理解下代码:

    struct timeval tv_interval = {1, 0};//之后产生信号的间隔时间
    struct timeval tv_value = {5, 0};//第一次产生信号的时间

    另外,setitimer的第三个参数ovalue是干嘛用的呢?下面用实验也来说明下:

    #include <unistd.h>
    #include <sys/stat.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    #include <fcntl.h>
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <signal.h>
    #include <sys/time.h>
    
    
    #define ERR_EXIT(m) 
        do 
        { 
            perror(m); 
            exit(EXIT_FAILURE); 
        } while(0)
    
    
    int main(int argc, char *argv[])
    {
        struct timeval tv_interval = {1, 0};
        struct timeval tv_value = {1, 0};//第一次产生信号需要等待1秒
        struct itimerval it;
        it.it_interval = tv_interval;
        it.it_value = tv_value;
        setitimer(ITIMER_REAL, &it, NULL);
    
        int i;
        for (i=0; i<10000; i++);//故意产生10000次的循环,运行时间肯定不足一秒,所以目的也就是为了看到第三个参数的效果
            ;
    
        struct itimerval oit;
        setitimer(ITIMER_REAL, &it, &oit);//在第一次信号还没有产生之时,又重新设置一个定时,这时oit会存放上一次设置的时钟它还剩余的时间
        printf("%d %d %d %d
    ", (int)oit.it_interval.tv_sec, (int)oit.it_interval.tv_usec, (int)oit.it_value.tv_sec, (int)oit.it_value.tv_usec);
    
        return 0;
    }

    编译运行:

    【注意】:这个效果跟下面要说明的getitimer效果一样,但是有一些区别,getitimer得到剩余时间是不重新设置时钟。

    另外还有一个相关函数:

    代码如下:
    #include <unistd.h>
    #include <sys/stat.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    #include <fcntl.h>
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <signal.h>
    #include <sys/time.h>
    
    
    #define ERR_EXIT(m) 
        do 
        { 
            perror(m); 
            exit(EXIT_FAILURE); 
        } while(0)
    
    
    int main(int argc, char *argv[])
    {
        struct timeval tv_interval = {1, 0};
        struct timeval tv_value = {1, 0};
        struct itimerval it;
        it.it_interval = tv_interval;
        it.it_value = tv_value;
        setitimer(ITIMER_REAL, &it, NULL);
    
        int i;
        for (i=0; i<10000; i++);
            ;
    
        getitimer(ITIMER_REAL, &it);//获得产生首次信号的时间,并没有从
        printf("%d %d %d %d
    ", (int)it.it_interval.tv_sec, (int)it.it_interval.tv_usec, (int)it.it_value.tv_sec, (int)it.it_value.tv_usec);
    
        return 0;
    }

    运行效果一样,这里就不演示了,好了,关于信号的学习就告一段落了,下个章节再见!!

     
  • 相关阅读:
    Leetcode 122. 买卖股票的最佳时机 II
    Leetcode 121. 买卖股票的最佳时机
    Leetcode 205. 同构字符串
    Leetcode 875. 爱吃香蕉的珂珂
    Leetcode 921. 使括号有效的最少添加
    Leetcode 238. 除自身以外数组的乘积
    评论设置----第二章:创建和管理内容
    其它内容选项----第二章:创建和管理内容
    预览和全展示----第二章:创建和管理内容
    Drupal的主题----第一章:Drupal的介绍
  • 原文地址:https://www.cnblogs.com/webor2006/p/3763085.html
Copyright © 2020-2023  润新知