【Linux】信号集及信号集操作函数

文章目录

  • 一、信号集是什么?
  • 二、信号集操作函数
    • 1. sigemptyset
    • 2. sigfillset
    • 3. sigaddset
    • 4. sigdelset
    • 5. sigismember
    • 6. sigprocmask (仅用于读取或更改block表)
    • 7. sigpending (仅用于读取pending表)


一、信号集是什么?

对于每个进程, 都有三个信号集, 分别是:

  • block: 阻塞信号集
  • pending: 未决信号集
  • handler: 信号的处理函数

用 sigset_t 用来表示 block, pending 两个表的类型, 作位图使用, 0/1 分别表示无效/有效, 在 block 表中, 0 表示对应信号未收到阻塞信号, 1 表示对应信号收到阻塞信号, 在 pending 表中, 0 表示该进程未收到对应信号, 1 表示该进程收到对应信号, 在 handler 表中, 存在两种可选的宏, 分别是 SIG_DFL, SIG_IGN, 分别表示执行默认处理函数和忽略该信号, 即收到该信号后什么也不做就是处理动作.

当一个进程的 block 表中的对应信号被置为 1, 即表示该信号被阻塞了, 即使该进程收到了对应信号, 只会将其存储在 pending 表中, 并不会处理该信号, 当该信号在 block 表中被置为 0, 即解除对该信号的阻塞时, 此时如果 pending 表中对应的信号为 1, 才会在合适的时候(由内核态到用户态时)执行对应的处理函数.

其中 block, pending 表中的下标就表示相应的信号, handler 中存储的类型为 void sighandler(int signo).

二、信号集操作函数

1. sigemptyset

头文件: #include <signal.h>
函数声明: int sigemptyset(sigset_t *set);

  • 返回值: 成功返回 0, 失败返回 -1.
  • set: 被设置的集合.

功能: 将信号集(block/pending)中的二进制位都置为 0, 可用于初始化.

示例代码:

#include <iostream>
#include <signal.h>
using namespace std;int main()
{sigset_t set;sigemptyset(&set);for(int i = 1; i <= 31; ++i){cout << sigismember(&set, i) ? 1 : 0;}cout << endl;return 0;
}

运行结果:
在这里插入图片描述
可以看到该集合中的二进制位都被置为 0 了.

2. sigfillset

头文件: #include <signal.h>
函数声明: int sigfillset(sigset_t *set);

  • 返回值: 成功返回 0, 失败返回 -1.
  • set: 被设置的集合.

功能: 将信号集(block/pending)中的二进制位都置为 1.

示例代码:

#include <iostream>
#include <signal.h>
using namespace std;int main()
{sigset_t set;sigfillset(&set);for(int i = 1; i <= 31; ++i){cout << sigismember(&set, i) ? 1 : 0;}cout << endl;return 0;
}

运行功能:
在这里插入图片描述
可以看到该集合中的二进制位都被置为 1 了.

3. sigaddset

头文件: #include <signal.h>
函数声明: int sigaddset(sigset_t *set, int signum);

  • 返回值: 成功返回 0, 失败返回 -1.
  • set: 被设置的集合.
  • signum: 设置的信号

功能: 将对应信号设置到信号集(block/pending)中, 对应信号的二进制位置为 1.

示例代码:

#include <iostream>
#include <signal.h>
using namespace std;int main()
{sigset_t set;sigemptyset(&set);sigaddset(&set, 2);for(int i = 31; i >= 1; --i){cout << sigismember(&set, i) ? 1 : 0;}cout << endl;return 0;
}![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b0fca399c38143b49331eb6613e9223e.png)

运行结果:
在这里插入图片描述
可以看到, 对应的信号被设置进了信号集中.

4. sigdelset

头文件: #include <signal.h>
函数声明: int sigdelset(sigset_t *set, int signum);

  • 返回值: 成功返回 0, 失败返回 -1.
  • set: 被设置的集合.
  • signum: 需要删除的信号.

功能: 将对应信号从信号集(block/pending)中删除, 对应信号的二进制位置为 0.

示例代码:

#include <iostream>
#include <signal.h>
using namespace std;int main()
{sigset_t set;sigfillset(&set);sigdelset(&set, 2);for(int i = 31; i >= 1; --i){cout << sigismember(&set, i) ? 1 : 0;}cout << endl;return 0;
}

运行结果:
在这里插入图片描述
可以看到信号集中对应信号的 1 被置为了 0.

5. sigismember

头文件: #include <signal.h>
函数声明: int sigismember(const sigset_t *set, int signum);

  • 返回值: 如果 signum 信号在 set 中为 1, 则返回 1, 为 0, 则返回 0, 调用失败返回 -1.
  • set: 被检测的集合.
  • signum: 被检测的信号.

功能: 检测信号集中是否收到对应信号.

示例代码:

#include <iostream>
#include <signal.h>
using namespace std;int main()
{sigset_t set;sigemptyset(&set);sigaddset(&set, 2);for(int i = 31; i >= 1; --i){cout << sigismember(&set, i) ? 1 : 0;}cout << endl;return 0;
}

运行结果:
在这里插入图片描述
在代码中, 先对信号集进行初始化, 在将 2 号信号设置进信号集中, 此时通过 sigismember 函数遍历判断信号集收到了哪些信号.

6. sigprocmask (仅用于读取或更改block表)

头文件: #include <signal.h>
函数声明: int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

  • 返回值: 成功返回 0, 失败返回 -1.
  • how: 如何更改进程的 block 表.
  • set: 将 set 信号集的内容设置给进程的 block 表.
  • oldset: 输出型参数, 将调用进程老的 block 表中的内容保存到 oldset 中.

功能: 函数 1 - 5 只是对 sigset_t 类型的变量进行操作, 通过 sigprocmask 函数才能将 sigset_t 类型的变量设置进调用进程的 block 表中.

how 参数可选值:

  • SIG_BLOCK: 将参数 set 中的阻塞信号添加到调用进程的 block 表中, 相当于 mask |= set, 追加式添加阻塞信号.
  • SIG_UNBLOCK: 将参数 set 中的阻塞信号从调用进程的 block 表中解除, 相当于 mask = mask & (~set).
  • SIG_SETMASK: 将调用进程的 block 表设置为 set, 相当于 mask = set, 覆盖式添加阻塞信号.

在 Linux 中, how 的三个参数其实也就是宏:

/* Values for the HOW argument to `sigprocmask'.  */
#define	SIG_BLOCK     0		 /* Block signals.  */
#define	SIG_UNBLOCK   1		 /* Unblock signals.  */
#define	SIG_SETMASK   2		 /* Set the set of blocked signals.  */

示例代码:

#include <iostream>
#include <signal.h>
#include <unistd.h>
using namespace std;int main()
{sigset_t set;sigset_t old_set;sigemptyset(&set);sigemptyset(&old_set);sigaddset(&set, 2);sigprocmask(SIG_SETMASK, &set, &old_set);while(1){for(int i = 31; i >= 1; --i){cout << sigismember(&set, i) ? 1 : 0;}cout << endl;sleep(1);}return 0;
}

运行结果:
在这里插入图片描述
首先将 2 号信号添加到信号集变量 set 中, 通过 SIG_SETMASK 的方式将 set 中设置的阻塞信号添加到调用进程的阻塞信号集中, 在此之前, 先将调用进程原本的阻塞信号集中的内容添加给 old_set, 而后调用进程的阻塞信号集才会被 set 覆盖, 第三个参数也可以置为 nullptr, 表示不接收调用进程原本的阻塞信号集, 通过运行结果可以直观的看出, 在 2 号信号被阻塞后, 我们在终端输入 Ctrl + C 后就无效了.

7. sigpending (仅用于读取pending表)

头文件: #include <signal.h>
函数声明: int sigpending(sigset_t *set);

  • 返回值: 成功返回 0, 失败返回 -1.
  • set: 输出型参数, 将调用进程的 pending 表设置进 set.

功能: 获取调用进程的 pending 表.

示例代码:

#include <iostream>
#include <signal.h>
using namespace std;int main()
{sigset_t set;sigpending(&set);for(int i = 31; i >= 1; --i){cout << sigismember(&set, i);fflush(stdout);}cout << endl;return 0;
}

运行结果:
在这里插入图片描述
调用进程没有收到任何信号, 所以 pending 表全为 0.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s集群部署成功后某个节点突然出现notready状态解决办法

通过&#xff1a; kubectl get nodes 查看master1节点为not ready 通过查看日志&#xff1a; journalctl -f -u kubelet.service 看到这里 查看状态&#xff1a; systemctl status kubelet.service 重启一样会报错 执行&#xff1a; swapoff -a 执行后&#xff0c;重启…

pytorch深度学习-环境搭建

1.Anaconda下载&#xff08;首先安装Anaconda不需要先安装Python了&#xff01;&#xff09; 版本 3.11. Download Anaconda Distribution | Anaconda 1.2 跳过注册直接下载 2.安装 直接next, (Install for 可以选择All Users&#xff0c;我选择的是All Users) 点击默认选项…

Qt Designer 使用笔记

目录 qt designer安装 预览 Ctrl R 使用 Qt Designer 设计的ui文件可以通过以下命令转为.py文件 命令行脚本&#xff1a; pycharm工具栏配置&#xff1b; pyqt5也是可以的&#xff1a; 2.2 测试是否配置成功 设置背景颜色&#xff1a; ui收集 qt designer安装 pip ins…

JavaEE-网络初识

文章目录 一、网络背景1.1 起源1.2 国内网络的发展 二、关键概念2.1 网络2.2 设备2.3 ip地址与端口号 三、协议3.1 协议分层3.2 OSI七层模型3.3 TCP/IP五层模型3.4 数据传输过程的简单叙述 一、网络背景 1.1 起源 在国外大概时上世纪70年代左右&#xff0c;网络就出现了&…

U-Mail邮件系统取得多项适配认证,全面支持国产化信创环境

随着信息技术的发展&#xff0c;信息化建设越来越深入到社会各个领域&#xff0c;成为驱动经济社会发展的重要力量。在此背景下&#xff0c;我国正加快构建国家信息安全保障体系&#xff0c;实现自主可控&#xff0c;形成安全可靠的信息技术体系。这正是我们所说的“信创”&…

ssl证书价格一年多少钱?怎么申请?

随着各大平台下架了一年期免费证书&#xff0c;免费证书的有效期都为90天。更多企业选择付费证书。费用是众多用户关心的话题&#xff0c;一年期SSL证书价格在几十到几千元不等。 一年期SSL证书价格查看https://www.joyssl.com/certificate/select/0-1000.html?nid16 下面是…

如何官方查询论文分区,中科院及JCR

中科院分区 有一个小程序&#xff1a;中科院文献情报中心分区表 点2023升级版&#xff0c;输入期刊名 大类1区 JCR分区 进入官方网站 Journal Citation Reports 输入要查询的期刊名&#xff0c;点开 拼命往下拉 这就是根据影响因子的排名&#xff0c;在computer science&am…

农业场景下的slam论文汇总

文章目录 概述2020Ground-Level Mapping and Navigating for Agriculture Based on IoT and Computer VisionCanopy Density Estimation in Perennial Horticulture Crops Using 3D Spinning Lidar SLAM 2021Mobile 3D scan LiDAR: a literature reviewSLAM in the Field: An E…

flutter webview加载本地文件出现跨域解决方案

一直报错 [INFO:CONSOLE(17)] "Access to image at file:///android_asset/flutter_assets/assets/jump/box_bottom.png from origin null has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome…

带你玩转OpenHarmony AI:打造智能语音子系统

简介 AI时代&#xff0c;智者当先&#xff0c;判断一个终端设备是否智能&#xff0c;语音能力是必不可缺的。智能家居、智慧厨房、智能汽车等等&#xff0c;一切衣食住行都在往智能方向发展&#xff0c;那我们该如何在OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&am…

未来十年,IT行业的无限可能!

未来十年&#xff0c;IT行业的无限可能&#xff01; &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学…

多联机分户计费控制系统

中央空调多联机分户计费控制系统&#xff0c;针对国内常见几种品牌的多联机空调系统实行&#xff0c;远程控制与计费管理。系统采用MQTT网络协议&#xff0c;以订阅/发布模式实行设备感知&#xff0c;实现对室外机、室内机的状态监测、实时故障报警、累计分摊费用的实时数据传导…

AI - 各类AI针对Excel分析对比

一个水果销量表&#xff0c;Excel包含多个年份sheet&#xff0c;需要提取某个品种的水果每年的销量&#xff0c;看看几个AI的分析结果吧 1、文心一言3.5&#xff08;不支持Excel&#xff09; 不支持上传Excel文件 2、 通义千问2.5&#xff08;完成★&#xff09; 顺利完成…

C++-函数

函数&#xff08;Function&#xff09;&#xff1a;是一个提前封装好的、可重复使用的、完成特定功能的独立代码单元。 特点&#xff1a;提前封装、可重复使用的、完成特定功能 将针对特定功能的、有重复使用需求的代码&#xff0c;提前封装到函数内&#xff0c; 在需要的时候…

游戏陪玩/在线租号/任务系统网站源码

源码介绍 游戏陪玩系统/在线租号系统/小姐姐陪玩任务系统/网游主播任务威客平台源码/绝地吃鸡LOL在线下单/带手机端/声优线上游戏任务系统网站源码 界面美观,功能齐全,已对接支付,安装教程放源码压缩包里了! 界面截图 源码下载 https://download.csdn.net/download/huayula…

【计算机网络原理】浅谈应用层协议的自定义和传输层UDP协议的总结

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

如何在cPanel面板中开启双因素身份验证

本周有一个客户&#xff0c;购买Hostease的主机&#xff0c; 客户购买的是Linux虚拟主机&#xff0c;带cPanel面板的。询问我们的在线客服&#xff0c;如何加强他的cPanel的安全性。cPanel的双因素身份验证功能可以帮助帮客户加固安全性。 双因素身份验证(2FA)是一种增强安全性…

【虚拟机软件】 VMware Workstation Pro 17 新建 Linux 虚拟机教程(CentOS 7 版本)

文章目录 下载安装 VMware Workstation Pro 17 软件下载 Linux 的 ISO 映像文件Linux版本选择 新建虚拟机准备配置新建安装 后续设置文章导航 我是一名立志把细节说清楚的博主&#xff0c;欢迎【关注】&#x1f389; ~ 原创不易&#xff0c; 如果有帮助 &#xff0c;记得【点赞…

slam14讲(第8讲、前端里程计)LK光流、直接法

直接法的引出 因为第7讲大部分都是讲特征点法&#xff0c;通过提取orb特征点和点的描述子&#xff0c;来构建两帧图像之间的特征点对应关系。这种方法会有缺点&#xff1a; 关键点和描述子提取计算耗时&#xff0c;如果相机的频率高&#xff0c;则slam算法大部分耗时被占。特…

【MySQL精通之路】InnoDB(10)-行格式

目录 1.表数据结构 1.1 聚集索引数据结构 1.2 辅助索引数据结构 2.行格式 2.1 REDUNDANT行格式 2.2 REDUNDANT存储特性 2.3 COMPACT行格式 2.4 COMPACT存储特性 2.5 DYNAMIC行格式 2.6 DYNAMIC存储特性 2.7 COMPRESSED行格式 2.8 COMPRESSED存储特性 3.定义表格的…