信号集(未决信号集,阻塞信号集)

2023-11-05

        未决信号集和阻塞信号集的关系

        阻塞信号集是当前进程要阻塞的信号的集合,未决信号集是当前进程中还处于未决状态的信号的集合,这两个集合存储在内核的PCB中。

  • 下面以SIGINT为例说明信号未决信号集和阻塞信号集的关系:
  •         当进程收到一个SIGINT信号(信号编号为2),首先这个信号会保存在未决信号集合中,此时对应的2号编号的这个位置上置为1,表示处于未决状态;在这个信号需要被处理之前首先要在阻塞信号集中的编号为2的位置上去检查该值是否为1:
    •         如果为1,表示SIGNIT信号被当前进程阻塞了,这个信号暂时不被处理,所以未决信号集  上该位置上的值保持为1,表示该信号处于未决状态;
      •         如果为0,表示SIGINT信号没有被当前进程阻塞,这个信号需要被处理,内核会对SIGINT信号进行处理(执行默认动作,忽略或者执行用户自定义的信号处理函数),并将未决信号集中编号为2的位置上将1变为0,表示该信号已经处理了,这个时间非常短暂,用户感知不到。
        •         当SIGINT信号从阻塞信号集中解除阻塞之后,该信号就会被处理。

 

 

信号集相关函数       

  • int sigemptyset(sigset_t *set);

函数说明:将某个信号集清0  

函数返回值:成功:0;失败:-1,设置errno

  • int sigfillset(sigset_t *set);

函数说明:将某个信号集置1   

函数返回值:成功:0;失败:-1,设置errno

  • int sigaddset(sigset_t *set, int signum);

函数说明:将某个信号加入信号集合中

函数返回值:成功:0;失败:-1,设置errno

  • int sigdelset(sigset_t *set, int signum);

函数说明:将某信号从信号清出信号集   

函数返回值:成功:0;失败:-1,设置errno

  • int sigismember(const sigset_t *set, int signum);

函数说明:判断某个信号是否在信号集中

函数返回值:在:1;不在:0;出错:-1,设置errno

  • sigprocmask函数

        函数说明:用来屏蔽信号、解除屏蔽也使用该函数。其本质,读

        取或修改进程控制块中的信号屏蔽字(阻塞信号集)。

        特别注意,屏蔽信号只是将信号处理延后执行(延至解除屏蔽);而忽略表示将信号丢弃处理。

        函数原型:int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

        函数返回值:成功:0;失败:-1,设置errno

        函数参数:how参数取值:假设当前的信号屏蔽字为mask

        SIG_BLOCK: 当how设置为此值,set表示需要屏蔽的信号。

        SIG_UNBLOCK: 当how设置为此,set表示需要解除屏蔽的信号。

        set:传入参数,是一个自定义信号集合。由参数how来指示如何修改当前信号屏蔽字

        oldset:传出参数,保存旧的信号屏蔽字。

  • sigpending函数

        函数原型:int sigpending(sigset_t *set);    

        函数说明:读取当前进程的未决信号集函数参数:set传出参数

        函数返回值:成功:0;失败:-1,设置errno

 练习:编写程序,设置阻塞信号集并把所有常规信号的未决状态打印至屏幕(以二号和三号信号为例)

        

#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
using namespace std;

//信号处理函数
void sighandler(int signo)
{
        cout << "signo==[" << signo << "]" << endl;
}

int main()
{

        //注册SIGINT和SIGQUIT的信号处理函数
        signal(SIGINT, sighandler);//2 ctrl+c
        signal(SIGQUIT, sighandler);//3 ctrl+/

        //定义sigset_t类型的变量
        sigset_t pending, mask, oldmask;

        //初始化
        sigemptyset(&pending);
        sigemptyset(&mask);
        sigemptyset(&oldmask);

        //将SIGINT和SIGQUIT加入到阻塞信号集中
        sigaddset(&mask, SIGINT);
        sigaddset(&mask, SIGQUIT);

        //将mask中的SIGINT和SIGQUIT信号加入到阻塞信号集中
        //sigprocmask(SIG_BLOCK, &mask, NULL);
        sigprocmask(SIG_BLOCK, &mask, &oldmask);

        int i = 1;
        int k = 1;
        while(1)
        {
                //获取未决信号集
                sigpending(&pending);

                for(i=1; i<32; i++)
                {
                        //判断某个信号是否在集合中
                        if(sigismember(&pending, i)==1)
                        {
                                cout << "1";
                        }
                        else
                        {
                                cout << "0";
                        }
                }
                cout << endl;

                if(k++%10==0)
                {
                        //从阻塞信号集中解除对SIGINT和SIGQUIT的阻塞
                        //sigprocmask(SIG_UNBLOCK, &mask, NULL);        
                        sigprocmask(SIG_SETMASK, &oldmask, NULL);
                }
                else
                {
                        sigprocmask(SIG_BLOCK, &mask, NULL);
                }

                sleep(1);
        }

        return 0;
}

结果如下:

        

 产生信号后就被阻塞,然后被打印出来1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

信号集(未决信号集,阻塞信号集) 的相关文章

  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 在Linux中创建可执行文件

    我计划做的一件事是编写 非常简单的 Perl 脚本 并且我希望能够在不从终端显式调用 Perl 的情况下运行它们 我明白 要做到这一点 我需要授予他们执行权限 使用 chmod 执行此操作非常简单 但它似乎也是一个稍微费力的额外步骤 我想要
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • php56 - CentOS - Remi 仓库

    我刚刚在测试盒上安装了 php 5 6 正常的 cli php 解释器似乎不存在 gt php v bash php command not found gt php56 v PHP 5 6 13 cli built Sep 3 2015
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 算法也要面向对象OO

    直接去模糊的去写 通过调试 一步步改 就算最后写出来了也不知道怎么写出来的 一定要先有整体思路 面向操作会很凌乱 算法也要面向对象 识别出变量 定义有确切含义的变量 以及这边变量之间互动的关系 时刻维护变量意义的正确性 也就是invaria
  • Flutter项目——静态页面布局4详情页

    详情页 override Widget build BuildContext context return Scaffold appBar AppBar widget代表了我们的 MovieDetail 这个类 当前类是控制器 需要用 wi
  • python模拟点击网页按钮_网页自动化开发(第一章)

    Web网页可以用许多工具进行开发 本文重点是介绍如何在python中使用Selenium实现网页自动化开发 主要先介绍Selenium的概念 开发环境搭建 selenium模拟用户打开浏览器并实现自动操作浏览的网页 比较适用于seleium
  • Centos7如何安装图形化界面 and 设置开机默认进入图形化界面

    因为VMware安装虚拟机的时候默认是最小安装的 所以没有图形化界面 这样将本机文件转移到虚拟机上的时候特别不方便 而装好图形化界面之后只需在本机复制 crtl c 然后在虚拟机中对应位置右键paste即可 1 打开命令行 输入 yum y
  • 蛇形/回形矩阵(超详细!看了不会你来打我)

    回型矩阵 给你一个整数n 按要求输出n n的回型矩阵 例如输入n 4 输出如下 分析 回形矩阵的填充轨迹如下所示 填充顺序 最上面的行 gt 最右边的列 gt 最下面的行 gt 最左边的列 gt 最上面的行 gt 首先 我们可以看出 填充轨
  • 使用SQL语句查询经纬度之间的距离和一定范围内的数据

    declare a decimal 18 7 经度 declare b decimal 18 7 维度 set a 119 921001 set b 35 943285 declare c decimal 18 7 set c 6371 地
  • JavaScript判断对象是否为空对象的几种方法

    目录 1 空对象对应的字符串为 2 for in 3 jquery 的 isEmptyObject 方法 4 Object getOwnPropertyNames 5 ES6 的 Object keys 6 JSON stringify 扩
  • 服务计算--简单 web 服务与客户端开发实战

    一 概述 利用 web 客户端调用远端服务是服务开发本实验的重要内容 其中 要点建立 API First 的开发理念 实现前后端分离 使得团队协作变得更有效率 任务目标 选择合适的 API 风格 实现从接口或资源 领域 建模 到 API 设
  • C++ 字符串

    C 提供了以下两种类型的字符串表示形式 C 风格字符串 C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言 并在 C 中继续得到支持 字符串实际上是使用 null 字符 终止的一维字符数组 因此 一个以 nu
  • 错误处理-mmdetection-AttributeError: ‘ConfigDict‘ object has no attribute ‘log_level‘

    第一次用商汤的mmdetection 遇到很多错误 mmdetection中网络的配置文件缺东西 至少缺了log level参数的值 此文章将继续更新我在使用过程中的问题与解决办法 敬请期待 祝你学习愉快 1 2 3 4 5 6 7 8 9
  • 数据库常用的四种方法

    排序查询 select 列表属性 列表属性 from 列表名order by 列表属性 列表属性 删除 delete from 列表名 where 列表属性 值 插入 insert into 列表名 values 值 值 值 值 inser
  • 数学知识整理:二重积分

    1 二重积分的性质 1 1 f x y 在有界闭区域上可积的充分条件 必要条件 在有界闭区域D上可积的函数f x y 必然是D上的有界函数 有界闭区域D上的连续函数或者分片连续函数f x y 在D上可积 1 2 线性性质 1 3 积分区域可
  • TCP/IP详解 卷1:协议 学习笔记 第十章 动态选路协议

    静态选路包括在配置接口时 以默认方式生成路由表项 对于直连路由 直连路由是由链路层协议发现的 一般指去往路由器的接口地址所在网段的路径 通过route命令增加表项 通常通过系统自引导程序文件 或通过ICMP重定向生成路由表项 通常在默认方式
  • 代理简介

    1 正向代理 正向代理类似一个跳板机 代理访问外部资源 比如我是一个用户 我访问不了某网站 但是我能访问一个代理服务器 这个代理服务器呢 他能访问那个我不能访问的网站 于是我先连上代理服务器 告诉他我需要那个无法访问网站的内容 代理服务器去
  • eclipse开发burpsuite插件

    安装相关软件 eclipse jee 2019 06 R win32 x86 64 zip burpsuite community edition v1 7 32 burpsuite 插件helloworld demo 下载链接在文章末尾
  • PyQt5之信号与信号槽

    一 信号与信号槽特点 PyQt的窗口控件类中有很多内置信号 开发者也可以添加自定义信号 信号与槽具有如下特点 一个信号可以连接多个槽 一个信号可以连接另一个信号 信号参数可以是任何Python类型 一个槽可以监听多个信号 信号与槽的连接方式
  • 定时删除centos服务器日志

    现在java程序的日志一般是使用log4j slf4j 来打日志 并且一般都喜欢用DailyRollingFileAppender模式 就是每天产生一个日志 还有一种是 RollingFileAppender模式 这个模式是按文件大小来保存
  • QT 实现五子棋

    1 程序简介 五子棋是一款大家都熟系的小游戏 这里给大家一步一步的详细介绍如何用QT开发这个游戏 并通过这款游戏的开发练习 进一步熟系 qvector qpoint qpainter QMouseEvent 产生工具栏等的用法和方法 2 程
  • 小学生报编程机器人有什么益处

    小学生报编程机器人有什么益处 小孩子的学习一直都是很多家长们非常关心和重视的一件事情 很多的家长在培养孩子的学习方面也可以说是相当的耐心的 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对于孩子学习机器人编程的好处并不是很清
  • 信号集(未决信号集,阻塞信号集)

    未决信号集和阻塞信号集的关系 阻塞信号集是当前进程要阻塞的信号的集合 未决信号集是当前进程中还处于未决状态的信号的集合 这两个集合存储在内核的PCB中 下面以SIGINT为例说明信号未决信号集和阻塞信号集的关系 当进程收到一个SIGINT信