文档章节

对信号函数sigaction的sa_mask的学习

B_ice
 B_ice
发布于 2016/07/27 00:47
字数 366
阅读 287
收藏 0

#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

© 著作权归作者所有

共有 人打赏支持
B_ice
粉丝 4
博文 49
码字总数 19470
作品 0
福州
私信 提问
信号发送函数sigqueue和信号安装函数sigaction

一,sigaction() #include <signal.h> int sigaction(int signum, const struct sigaction act, struct sigaction oldact)); sigaction 函数用于改变进程接收到特定信号后的行为。该函数的 ......

B_ice
2016/07/26
22
0
Head First C 学习日志 第十章 进程间通信 捕捉信号

Head First C 第十章 进程间通信 捕捉信号 关于信号 信号是操作系统控制程序的方式,举个栗子,操作系统在看到用户输入了Ctrl+C时,就会向程序发送中断信号。信号映射表 | 信号 | 处理函数 ...

AlexTuan
2016/04/17
32
0
实验3 信号

本文转自陈仲阳0 51CTO博客,原文链接:http://blog.51cto.com/wolfword/1240339

wbf961127
2017/11/07
0
0
UNIX sigaction函数详解

sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。它是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个...

突然帅了
2014/04/19
0
0
Linux(进程间通信-信号)

信号通信是在软件层面上对中断机制的一种模拟。信号是进程间通信机制中唯一的异步通信机制。 信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发...

王千千
2016/09/26
15
0

没有更多内容

加载失败,请刷新页面

加载更多

再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
3
0
C++网络编程(一)gRPC的编译

Google是真滴烦,整个编译链全是自家产品,在编译之前先来安装一堆东西 安装环境依赖 chocolatey Windows下的包管理系统,没有他就慢慢去下载下面的一堆乱七八糟的东西吧。CMD下执行下面这句...

Pulsar-V
今天
3
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0
分布式面试整理

并发和并行 并行是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有...

群星纪元
今天
3
0
手机通过wifi遥控arduino

手机下载Blinker 从Blinker官网下载手机App,安装到手机。 手机连接WiFi。 点击我的设备右上角的"+"添加设备,选择Arduino -> wifi接入,复制密钥以备后续使用。 点击新建的设备,可以在新界...

davidwbnu
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部