20.10  信号掩码(阻塞信号传递)

内核会为每个进程维护一个信号掩码,即一组信号,并将阻塞其针对该进程的传递。如果将遭阻塞的信号发送给某进程,那么对该信号的传递将延后,直至从进程信号掩码中移除该信号,从而解除阻塞为止。(由33.2.1节可知,信号掩码实际属于线程属性,在多线程进程中,每个线程都可使用pthread_sigmask()函数来独立检查和修改其信号掩码。)

向信号掩码中添加一个信号,有如下几种方式。

当调用信号处理器程序时,可将引发调用的信号自动添加到信号掩码中。是否发生这一情况,要视sigaction()函数在安装信号处理器程序时所使用的标志而定。

使用sigaction()函数建立信号处理器程序时,可以指定一组额外信号,当调用该处理器程序时会将其阻塞。

使用sigprocmask()系统调用,随时可以显式向信号掩码中添加或移除信号。

对前两种情况的讨论将推迟到 20.13 节对sigaction()函数的介绍之后,现在先来讨论sigprocmask()函数。

使用sigprocmask()函数既可修改进程的信号掩码,又可获取现有掩码,或者两重功效兼具。how参数指定了sigprocmask()函数想给信号掩码带来的变化。

SIG_BLOCK

将set指向信号集内的指定信号添加到信号掩码中。换言之,将信号掩码设置为其当前值和set的并集。

SIG_UNBLOCK

将set指向信号集中的信号从信号掩码中移除。即使要解除阻塞的信号当前并未处于阻塞状态,也不会返回错误。

SIG_SETMASK

将set指向的信号集赋给信号掩码。

上述各种情况下,若oldset参数不为空,则其指向一个sigset_t结构缓冲区,用于返回之前的信号掩码。

如果想获取信号掩码而又对其不作改动,那么可将set参数指定为空,这时将忽略how参数。

要想暂时阻止信号的传递,可以使用程序清单20-5中所示的一系列调用来阻塞信号,然后再将信号掩码重置为先前的状态以解除对信号的锁定。

程序清单20-5:暂时阻塞信号传递

SUSv3规定,如果有任何等待信号因对sigprocmask()的调用而解除了锁定,那么在此调用返回前至少会传递一个信号。换言之,如果解除了对某个等待信号的锁定,那么会立刻将该信号传递给进程。

系统将忽略试图阻塞SIGKILL和SIGSTOP信号的请求。如果试图阻塞这些信号,sigprocmask()函数既不会予以关注,也不会产生错误。这意味着,可以使用如下代码来阻塞除SIGKILL和SIGSTOP之外的所有信号:

【责任编辑:book TEL:(010)68476606】

点赞 0

linux信号掩码线程,20.10 信号掩码(阻塞信号传递)相关推荐

  1. linux 可定义信号数,Linux系统编程(20)——信号基本概念

    信号及信号来源 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知 ...

  2. [2022.8.20][10 信号]使用sigprocmask函数阻塞SIGQUIT信号

    1 相关函数介绍 1.1 信号集函数 sigset_t表示一个信号集,如下为5个处理信号集的函数: #include <signal.h>//成功返回0,出错返回-1 int sigemp ...

  3. 【B站视频笔记】linux 进程间通信(ipc)信号(软中断信号)signal库函数、可靠信号和不可靠信号、信号集sigprocmask(信号掩码、信号递达Delivery、信号未决Pending)

    [视频教程]Linux信号详解(可靠信号.不可靠信号.阻塞信号.信号处理函数) [博文]Linux信号 文章目录 背景 课程笔记 一.如何让程序在后台运行 1.加"&"符号 ...

  4. Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】

    linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...

  5. Linux系统中消息队列,共享内存、信号和线程的基本操作使用方法

    Linux系统中消息队列,共享内存.信号和线程高级操作 第十一章 消息队列 10.1消息队列定义 10.2 消息队列特点 10.3 key值 10.4 创建消息队列 10.4.1 发送消息 10.4. ...

  6. Linux信号 六 信号与线程的关系

    " POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX, 缩写为 POSIX ),POSIX标准定义了操作系统应该为应用 ...

  7. linux 信号_Linux的信号和线程

    Linux的信号和线程-Tech Talk 让技术发出声音​www.ttalk.im 什么是线程 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元. ...

  8. linux线程关闭信号,Linux/UNIX用同步方法处理异步信号

    一. 前言 Linux/UNIX进程信号处理复杂易出错,而用在多线程中就更加复杂脆弱,这里不探讨相关历史渊源,只给出一种在实践中简单可靠的信号处理方式.后文讨论的线程模型是POSIX thread(p ...

  9. linux之进程线程信号全解

    一.linux进程全解 1.程序的开始结束及预处理atexit函数 main函数由谁调用:其实在裸机程序中c语言运行前是需要一段引导的汇编代码为c语言运行准备环境的如栈,只是在使用编译器开发过程中我们 ...

最新文章

  1. redis没有加密码导致服务器被当做矿机了
  2. 一个简单的验证码识别教程
  3. SAP UI5 sap.ui.core.OpenState.CLOSED Dialog open and close
  4. eclipse插件安装方法
  5. Flink开发需要的环境
  6. 信息系统分析与设计课程心得
  7. Java基础~Java ASCII码的转换
  8. docker安装gamit_gamit的安装步骤
  9. 域名讲解(一)域名基础概念
  10. windows各类密码搜集
  11. 学科前沿大作业:区块链技术的相关应用
  12. php伪装请求ip,php搞定ip伪装的两种方式
  13. intellij idea 主题设为白色
  14. 两个long型数据相除结果错误问题解决
  15. Mongodb学习(1)安装以及配置
  16. 芯片封装测试流程详解
  17. Gradle自定义AAR文件名称
  18. 系统升级 | RK3568开发平台成功搭载SylixOS国产实时操作系统
  19. Android中Uri和path file三者的相互转换
  20. 【力学性能预测】材料力学性能预测数据集介绍

热门文章

  1. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-第8章-鲁棒方差控制
  2. 2.10 数据增强-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  3. STM32 进阶教程 17 - ADC注入通道
  4. Linux数据报文接收发送总结1
  5. 【编程通识】PlantUML绘制时序图样例
  6. 射频篇(二) 模拟、射频器件学习(2) ——功分器(Power divider)
  7. 【PSO运输优化】基于MATLAB的PSO运输优化算法的仿真
  8. 时域和频域的麦克斯韦方程组
  9. JavaScript中HTML的DOM
  10. 【极值问题】【CF1063B】 Labyrinth