zoukankan      html  css  js  c++  java
  • 信号-(2)

    信号集
    - 信号的集合,多个信号放入信号集。
    sigset_t -> 一个超大的整数(128字节)
    关于集合的函数:
    增加信号 - sigaddset()
    删除信号 - sigdelset()
    查询信号 - sigismember()
    清空信号集 - sigemptyset()
    填满信号集 - sigfillset()
    有信号就是对应二进制位 置1
    无信号就是对应二进制位 置0
    位与 用来置0,位或 用来置1,位异或 取反

    例子:
    #include <stdio.h>
    #include <signal.h>

    int main(){
      printf("size=%d ",sizeof(sigset_t));
      sigset_t set;
      printf("set=%d ",set);
      sigemptyset(&set);
      printf("set=%d ",set);//0
      sigaddset(&set,2);//把倒数第二位置1
      sigaddset(&set,3);
      printf("set=%d ",set);//2+4 = 6
      sigaddset(&set,7);
      printf("set=%d ",set);//2+4+64 = 70
      sigdelset(&set,3);
      printf("set=%d ",set);//2+64 = 66
      if(sigismember(&set,2))

      {
        printf("signal num 2 is exist ");
      }
    }

    [root@aiyq195 day08]# ./sigset
    size=128

    set=-1085854584
    set=0
    set=6
    set=70
    set=66
    signal num 2 is exist

    信号屏蔽
    - 执行关键代码时,不希望代码被信号打断,可以使用信号屏蔽防止信号打断程序。信号屏蔽不是没有信号到来,而是信号来了暂时不处理,等解除了屏蔽以后再处理。

    信号屏蔽和信号集结合使用,
    函数:sigprocmask() 用于信号屏蔽。
    int sigprocmask(int how,sigset_t* new, sigset_t* old);
    参数how有三个值:
    SIG_BLOCK: 相当于加法 原有的 + new的
    A B C + C D E -> A B C D E
    SIG_UNBLOCK: 相当于减法 原有的 - new的
    A B C - C D E -> A B
    SIG_SETMASK: 相当于赋值 直接等于new的
    A B C C D E -> C D E (最常用)

    new是需要屏蔽的信号(传入参数)
    old是以前屏蔽的信号(传出参数),如果以前屏蔽的信号不需要保留,给NULL即可。
    例子:
    #include <stdio.h>
    #include <signal.h>
    #include <stdlib.h>

    void fa(int signo){
    printf("get the singal %d ",signo);
    }
    int main(){
    signal(SIGINT,fa); signal(SIGQUIT,fa);//不可靠信号
    signal(40,fa);//可靠信号
    printf("pid=%d ",getpid());
    printf("The e word is coming and signal not mask ");
    sleep(10);//只要来一个信号,休眠就结束
    printf("the word is f ,the singal is mask ");
    sigset_t new,old;
    sigemptyset(&new);
    sigaddset(&new,2); sigaddset(&new,3);
    sigaddset(&new,40);
    sigprocmask(SIG_SETMASK,&new,&old);//信号屏蔽
    sleep(20);
    printf("get the mask time singal ");
    sigset_t set;
    sigpending(&set);//获取了信号屏蔽期间来过的信号
    if(sigismember(&set,2)) printf("singal 2 is coming ");
    if(sigismember(&set,3)) printf("singal 3 is coming ");
    printf("the word f is over,the singal mask over ");
    sigprocmask(SIG_SETMASK,&old,NULL);//解除屏蔽
    }

    [root@aiyq195 day08]# ./sigmask1
    pid=13778
    The e word is coming and signal not mask
    the word is f ,the singal is mask
    get the mask time singal
    the word f is over,the singal mask over

    例子:

    #include <stdio.h>
    #include <signal.h>
    #include <stdlib.h>

    void fa(int signo){
    printf("get the signo %d ",signo);
    }
    int main(){
    signal(SIGINT,fa); signal(SIGQUIT,fa);//不可靠信号
    signal(40,fa);//可靠信号
    printf("pid=%d ",getpid());
    printf("the word a is start,the singal is not mask ");
    sleep(10);//只要来一个信号,休眠就结束
    printf("the word b is start,the singal is not mask ");
    sigset_t new,old;
    sigemptyset(&new);
    sigaddset(&new,2); sigaddset(&new,3);
    sigaddset(&new,40);
    sigprocmask(SIG_SETMASK,&new,&old);//信号屏蔽
    sleep(20);
    printf("get the mask signo ");
    sigset_t set;
    sigpending(&set);//获取了信号屏蔽期间来过的信号
    if(sigismember(&set,2)) printf("singal 2 come ");
    if(sigismember(&set,3)) printf("singal 3 come ");
    printf("the word b is over,the mask is over ");
    sigprocmask(SIG_SETMASK,&old,NULL);//解除屏蔽
    }



  • 相关阅读:
    基于深度学习的单目图像深度估计
    OpenCV探索之路(二十三):特征检测和特征匹配方法汇总
    TensorFlow练习24: GANs-生成对抗网络 (生成明星脸)
    深度估计&平面检测小结
    论文翻译——Rapid 2D-to-3D conversion——快速2D到3D转换
    Opencv改变图像亮度和对比度以及优化
    如何将OpenCV中的Mat类绑定为OpenGL中的纹理
    Eclipse控制台中文乱码
    给java中的System.getProperty添加新的key value对
    中文简体windows CMD显示中文乱码解决方案
  • 原文地址:https://www.cnblogs.com/aiyq195/p/6428658.html
Copyright © 2011-2022 走看看