博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对信号函数sigaction的sa_mask的学习
阅读量:5976 次
发布时间:2019-06-19

本文共 1522 字,大约阅读时间需要 5 分钟。

hot3.png

#include "apue.h"

static void sigparse1(int sig,siginfo_t * param,void * p2){
        pr_mask("in sigparse1: ");    // pr_mask("in sigparse1: "); 打印in sigparse1: 当前屏蔽信号
                //raise(SIGUSR2);
        sleep(5);
        printf("end sigparse1\n");
}

static void sigparse2(int sig,siginfo_t * param,void *p2){

        pr_mask("in sigparse2: ");
                //raise(SIGUSR1);
        sleep(5);
        printf("end sigparse2\n");
}

int main (int argc, const char * argv[]) {

        struct sigaction act;
        act.sa_sigaction=sigparse1;
        act.sa_flags = 0;
        sigemptyset(&act.sa_mask);
        sigaddset(&act.sa_mask, SIGUSR2);
        sigaction(SIGUSR1, &act, NULL);
        
        
        act.sa_sigaction = sigparse2;
        act.sa_flags = 0;
        sigemptyset(&act.sa_mask);
                //sigaddset(&act.sa_mask,SIGUSR1);
        sigaction(SIGUSR2, &act, NULL);
        
        printf("start working ,send signal cmd:\nkill -s USR1 %d\n",getpid());
                //raise(SIGUSR1);
                //sleep(1);
                //raise(SIGUSR2);
        pause();
        sleep(25);
        return 0;
}

下面是重点:

sa_mask指定在信号处理程序执行过程中,哪些信号应当被阻塞。缺省情况下当前信号本身被阻塞,防止信号的嵌套发送,除非指定SA_NODEFER或者SA_NOMASK标志位,处理程序执行完后,被阻塞的信号开始执行。

注:请注意sa_mask指定的信号阻塞的前提条件,是在由sigaction()安装信号的处理函数执行过程中由sa_mask指定的信号才被阻塞。

运行输出:

   kill -s USR2 842

   kill -s USR1 842
输出:
   start working ,send signal cmd:
   kill -s USR1 842
   in sigparse2: SIGUSR2
   in sigparse1: SIGUSR1 SIGUSR2
   end sigparse1
   end sigparse2
而如果这样:
   kill -s USR1 854
   kill -s USR2 854
输出:
   start working ,send signal cmd:
   kill -s USR1 854
   in sigparse1: SIGUSR1 SIGUSR2
   end sigparse1 //理应该等待5秒后才打印end sigparse1的 , 可是为什么我发送kill -s USR2 854的时候 就马上输出这句,然后进入sigparse2函数了 呢?
   in sigparse2: SIGUSR2
   end sigparse2

转载于:https://my.oschina.net/u/2515635/blog/718746

你可能感兴趣的文章
数据结构与算法
查看>>
1.2封装数组之添加元素
查看>>
使用react的一点提醒17/10/26
查看>>
一步一步学习SignalR进行实时通信_7_非代理
查看>>
UDP可靠传输那些事(转)
查看>>
在CenOS7.5里安装Redis
查看>>
ionic+angularJS+cordova(FileTransfer)上传图片
查看>>
SNS的盈利模式分析
查看>>
矩阵快速幂模板
查看>>
利用express搭建一个restful api 服务器
查看>>
(转)调整.NET控件WebBrowser的默认浏览器内核版本
查看>>
HDU4116 Fruit Ninja (2011 Asia ChengDu Regional Contest)
查看>>
2017day2
查看>>
IPSec
查看>>
关于使用Java开发Mis系统
查看>>
CSS 溢出文本显示省略号的方法(兼容 IE、FF、Chrome)
查看>>
[原创]Android从xml加载到View对象过程解析
查看>>
并发问题的资源与待准备
查看>>
C++基础
查看>>
【12-26】go.js
查看>>