Linux信号:信号 信号集 信号集函数
1. 信号的概念
Linux进程间通信的方式之一。信号也称为“软件中断”。
信号特点:
- 简单;
- 携带信息有限;
- 满足特定条件才发送信号;
- 可进行用户空间和内核空间进程的交互;
信号4要素:
(1)编号;(2)名称;(3)事件;(4)默认处理方式。
2. 信号的编号
kill -l // 查看信号编号
POSIX信号标准:

1~31为常规信号;34~64为实时信号(驱动编程、硬件相关)。
为保证代码可移植性,请使用信号名进行编程。
Linux常规信号介绍:
| 编号 | 信号 | 事件 | 默认处理 |
| 1 | SIGHUP | 用户退出shell时,由该shell启动的所有进程会收到SIGHUP信号。 | 终止进程 |
| 2 | SIGINT | Ctrl + c 触发该信号,由该终端启动的正在运行的进程会收到SIGINT信号。 | 终止进程 |
| 3 | SIGQUIT | Ctrl + \ 触发该信号,由该终端启动的正在运行的进程会收到SIGQUIT信号。 | 终止进程 |
| 4 | SIGILL | CPU检测到某些进程执行非法指令。 | 终止进程并产生core文件 |
| 5 | SIGTRAP | 由断点指令或其他trap指令产生。 | 终止进程并产生core文件 |
| 6 | SIGABRT | 调用abort函数时产生该信号。 | 终止进程并产生core文件 |
| 7 | SIGBUS | 非法访问内存地址、内存对齐出错。 | 终止进程并产生core文件 |
| 8 | SIGFPE | 发生致命运算错误。浮点运算错误、溢出、除数为0等。 | 终止进程并产生core文件 |
| 9 | SIGKILL | 无条件终止进程。该信号不能被忽略、处理、阻塞。 | 终止任意进程 |
| 10 | SIGUSE1 | 用户定义的信号。程序员可在程序中定义并使用该信号。 | 终止进程 |
| 11 | SIGSEGV | 进程进行了无效内存访问(段错误)。 | 终止进程并产生core文件 |
| 12 | SIGUSR2 | 用户定义的信号。程序员可在程序中定义并使用该信号。 | 终止进程 |
| 13 | SIGPIPE | Broken pipe向一个无读端的管道写数据。 | 终止进程 |
| 14 | SIGALRM | 定时器超时,超时时间由系统调用alarm设置。 | 终止进程 |
| 15 | SIGTERM | 终止进程,该信号可被阻塞、终止。通常用来通知程序正常退出。kill命令的缺省选项就是这个信号。 | 终止进程 |
| 16 | SIGSTKFLT | Linux早期版本的信号,使用极少。 | 终止进程 |
| 17 | SIGCHLD | 子进程结束时,父进程会收到该信号。 | 忽略 |
| 18 | SIGCONT | 使暂停的进程继续运行 | 继续/忽略 |
| 19 | SIGSTOP | 暂停进程。不能被忽略、处理、阻塞。 | 暂停进程 |
| 20 | SIGTSTP | Ctrl + z 触发该信号,暂停与终端交互的进程。 | 暂停进程 |
| 21 | SIGTTIN | 后台进程读终端控制台 | 暂停进程 |
| 22 | SIGTTOU | 类似于SIGTTIN,后台进程向终端输出数据时触发 | 暂停进程 |
| 23 | SIGURG | socket上有紧急数据时,向当前进程发出该信号 | 忽略 |
| 24 | SIGXCPU | 进程执行时间超过CPU时间的总量。(不是超过了时间片) | 终止进程 |
| 25 | SIGXFSZ | 超过文件最大长度 | 终止进程 |
| 26 | SIGVTALRM | 虚拟时钟产生的信号,类似于SIGALRM。该信号3计算该进程占用CPU的时间 | 终止进程 |
| 27 | SIGPROF | 类似于SIGVTALRM,计算进程占用CPU时间 + 系统调用时间 | 终止进程 |
| 28 | SIGWINCH | 窗口大小变化时触发 | 忽略 |
| 29 | SIGIO | 向进程发出一个异步IO事件 | 忽略 |
| 30 | SIGPWR | 关机 | 终止进程 |
| 31 | SIGSYS | 无效的系统调用 | 终止进程并产生core文件 |
| 31~64 | SIGRTMIN~SIGRTMAX | Linux实时信号,无固定含义,可由用户自定义 | 终止进程 |
3. 信号的状态
(1)产生状态
a)用户发出信号:
Ctrl + c :SIGINT;
Ctrl + \ :SIGQUIT;
Ctrl + z :SIGSTOP;
b)硬件异常:
除数为0、无效内存访问、溢出等,被硬件检测到通知内核,内核将对应的信号发给相应进程。
c)软件异常:
检测到某种软件信号(如定时器alarm),则通知相关进程。
d)系统调用:
如kill、raise、abort等系统调用会发出信号。
注意:接收信号进程与发送信号进程的所有者必须相同,或发送信号进程的所有者是root用户。
e)kill、killall等会发送信号。
(2)未决状态:信号未被处理。
(3)递达状态:信号被处理了。
4. 阻塞信号集 & 未决信号集
每个进程的PCB中有两个信号集合:阻塞信号集 & 未决信号集。
两个集合都是用位图表示信号的状态,1表示阻塞或未决。
仅可设置阻塞信号集;未决信号集由内核自动设置。
(1)阻塞信号集:
将某信号加入该阻塞信号集,该信号将被阻塞;
若被阻塞期间收到该信号,则不会被处理;
但在解除阻塞后,阻塞期间收到的那次信号仍然会被处理,相当于滞后处理该信号。
(2)未决信号集:
某信号产生,未决信号集中描述该信号的状态位被置为1,表示该信号为未决状态;当信号被处理,该信号对应的状态位被置为0。
信号产生后由于某些原因(主要为被阻塞)不能抵达,这些信号状态为未决状态。
信号被阻塞期间,一直处于未决状态。

5. 信号集函数
(1)信号集操作函数
#include<signal.h>int sigemptyset(sigset_t* set); // 将set信号集置空
int sigfillset(sigset_t* set); // 将所有信号加入set信号集
int sigaddset(sigset_t* set, int signo); // 将signo信号加入set信号集
int sigdelset(sigset_t* set, int signo); // 将signo信号从set信号集移除
int sigismember(const sigset_t* set, int signo); // 判断set信号集中是否存在signo信号/*sigset_t为二进制位图*/
信号集操作函数使用示例:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>
#include<unistd.h>void showSet(sigset_t* set) { // 显示信号集for (int i = 1; i < 32; i++) {if (sigismember(set, i)) {printf("1");} else {printf("0");}}putchar('\n');
}int main(int argc, const char* argv[]) {int i = 0;// 定义信号集sigset_t set;// 清空信号集sigemptyset(&set);puts("sigemptyset后的信号集:");showSet(&set);// 将所有的信号加入信号集sigfillset(&set);puts("sigfillset后的信号集:");showSet(&set);// 将信号1,3从信号集中移除sigdelset(&set, SIGHUP);sigdelset(&set, SIGQUIT);puts("sigdelset后的信号集:");showSet(&set);// 将信号1,3加入信号集sigaddset(&set, SIGHUP);sigaddset(&set, SIGQUIT);puts("sigaddset后的信号集:");showSet(&set);return 0;
}
运行结果:

(2)sigprocmask函数
#include<signal.h>int sigprocmask(int how, const sigset_t* set, sigset_t* oldset);
/*
功能:根据how指定的方法对进程的阻塞信号集进行操作。新的阻塞信号集由set指定,原先的阻塞信号集由oldset保存。参数:how:对阻塞信号集的操作方式:SIG_BLOCK:向阻塞信号集中添加set信号集,新的信号集是set与oldset的并集。相当于mask = mask | set;SIG_UNBLOCK:从阻塞信号集中删除set集合。相当于mask = mask & ~set;SIG_SETMASK:将阻塞信号集设置为set。相当于mask = set;set:要操作的信号集地址。若为NULL,则不改变阻塞信号集。仅将当前的阻塞信号集保存到oldset中。oldset:保存原先阻塞信号集的地址。返回值:成功:0失败:-1,失败时错误码只可能是EINVAL,表示参数how不合法。
*/
sigprocmask示例:
屏蔽SIGINT(Ctrl + C)信号。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>
#include<unistd.h>void func0(int signum) {printf("捕捉到信号:%d\n", signum);
}void func1(int signum) {printf("捕捉到信号:%d\n", signum);
}int main(int argc, const char* argv[]) {int ret = -1;// 信号集sigset_t set;sigset_t old;/*注册信号处理函数。*/// SIGINT: Ctrl + c 2号信号signal(SIGINT, func0);/*SIGQUIT: Ctrl + \*/signal(SIGQUIT, func1);/*将SIGINT加入阻塞信号集*/printf("按回车键阻塞信号2 SIGINT.\n");// 只能输入回车,输入一个字符再回车,就相当于输入两个字符;第二个回车被下面的getchar接收。getchar();sigemptyset(&set); // 清空信号集sigaddset(&set, SIGINT); // 将2号信号加入信号集sigemptyset(&old); // 清空信号集ret = sigprocmask(SIG_BLOCK, &set, &old); // 设置阻塞信号集if (-1 == ret) {perror("sigprocmask");return 1;}printf("2号信号SIGINT屏蔽成功.\n");printf("按下回车键解除2号信号的屏蔽.\n");getchar();/*将阻塞信号集设置为原先的集合*/ret = sigprocmask(SIG_SETMASK, &old, NULL);if (-1 == ret) {perror("sigprocmask");return 1;}getchar();return 0;
}
运行结果:
(3)sigpending函数
获取未决信号集
#include<signal.h>int sigpending(sigset_t* set);
/*
功能:获取未决信号集存入set集合
参数:set:存储未决信号集
返回值:成功:0失败:-1
*/
sigpending示例:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>
#include<unistd.h>int main(int argc, const char* argv[]) {int ret = -1;sigset_t new;sigset_t old;sigset_t set;sigemptyset(&new); // 清空信号集setsigemptyset(&old); // 清空信号集setsigemptyset(&set); // 清空信号集set/*将信号2、3放入信号集*/sigaddset(&new, SIGINT);sigaddset(&new, SIGQUIT);ret = sigprocmask(SIG_BLOCK, &new, &old); // 将信号2、3放入阻塞信号集if (-1 == ret) {perror("sigprocmask");return 1;}getchar();ret = sigpending(&set); // 获取阻塞信号集if (-1 == ret) {perror("sigpending");return 1;}for (int i = 1;i < 32;i++) { // 打印阻塞信号集if (sigismember(&set, i)) {printf("%d ", i);}}putchar('\n');return 0;
}
将信号2、信号3加入阻塞信号集后,按Ctrl + c、Ctrl + \ ,被阻塞,之后解除阻塞会捕捉到信号2、信号3.
运行结果:
![]()
相关文章:
Linux信号:信号 信号集 信号集函数
1. 信号的概念 Linux进程间通信的方式之一。信号也称为“软件中断”。 信号特点: 简单;携带信息有限;满足特定条件才发送信号;可进行用户空间和内核空间进程的交互; 信号4要素: (1…...
详解八大排序算法-附动图和源码(插入,希尔,选择,堆排序,冒泡,快速,归并,计数)
目录 🍏一.排序的概念及应用🍏 1.排序的概念 2.排序的应用 3.常用的排序算法 🍎二.排序算法的实现🍎 1.插入排序 1.1直接插入排序 1.2希尔排序(缩小增量排序) 2.选择排序 2.1直接选择排序 2.2堆排序…...
网络编程--协议、协议族、地址族
写在前面 这里先介绍下socket函数(Windows版本)的函数声明,后续内容均围绕该声明展开: #include <winsock2.h> //af: 指定该套接字的协议族 //type: 指定该套接字的数据传输方式 //protocol: 指定该套接字的最终协议 //返…...
Linux入门操作
pwd 查看当前目录 与 自动补全 文件详情 drwxrwxr-x d代表文件夹 -代表文件 其中rwx rwx r-x r是可读 w是可写 x 执行 第一组(前三个)指文件拥有者的权限 第二组(中三个)代表文件拥有的组的权限 第三组(后三个&am…...
1。C语言基础知识回顾
学习嵌入式的C基础知识,主要包括几个核心知识点:三大语法结构、常用的数据类型、函数、结构体、指针、文件操作。 一、顺序结构 程序自上而下依次执行、没有分支、代码简单。 常见顺序结构有:四则运算:,-࿰…...
学习如何通过构建一个简单的JavaScript颜色游戏来操作DOM
学习如何通过构建一个简单的JavaScript颜色游戏来操作DOM 题目要求 我们将构建一个简单的颜色猜谜游戏。每次游戏启动时,都会选择一个随机的RGB颜色代码。根据游戏模式,我们将在屏幕上提供三个(简单)或六个(困难&…...
【算法学习】—n皇后问题(回溯法)
【算法学习】—n皇后问题(回溯法) 1. 什么是回溯法? 相信"迷宫"是许多人儿时的回忆,大家小时候一定都玩过迷宫游戏。我们从不用别人教,都知道走迷宫的策略是: 当遇到一个岔路口,会有以下两种情况…...
万亿OTA市场进入新爆发期,2025或迎中国汽车软件付费元年
伴随智能汽车市场规模发展,越来越多的汽车产品具备OTA能力,功能的优化、以及服务的差异化,成为了车企竞争的新战场。 例如,今年初,问界M5 EV迎来了首次OTA升级,升级内容覆盖用户在实际用车中的多个场景&am…...
Android硬件通信之 蓝牙Mesh通信
一,简介 蓝牙4.0以下称为传统蓝牙,4.0以上是低功耗蓝牙,5.0开始主打物联网 5.0协议蓝牙最重要的技术就是Mesh组网,实现1对多,多对多的无线通信。即从点对点传输发展为网络拓扑结构,主要领域如灯光控制等&…...
PG数据库实现bool自动转smallint的方式
删除函数: 语法: DROP FUNCTION IF EXISTS your_schema_name.function_name(arg_type1, arg_type2) CASCADE RESTRICT; 实例: DROP FUNCTION IF EXISTS platformyw.boolean_to_smallint(bool) CASCADE RESTRICT; 查询是否存在函数 语法: SELE…...
易观千帆 | 2023年3月证券APP月活跃用户规模盘点
易观:2023年3月证券服务应用活跃人数14131.58万人,相较上月,环比增长0.61%,同比增长0.60%;2023年3月自营类证券服务应用Top10 活跃人数6221.44万人,环比增长0.08%;2023年3月第三方证券服务应用T…...
2023年江苏专转本成绩查询步骤
2023年江苏专转本成绩查询时间 2023年江苏专转本成绩查询时间预计在5月初,参加考试的考生,可以关注考试院发布的消息。江苏专转本考生可在规定时间内在省教育考试院网,在查询中心页面中输入准考证号和身份证号进行查询,或者拨…...
JavaScript中sort()函数
sort()函数是javascript中自带函数,这个函数的功能是排序。 使用sort()函数时,函数参数如果不设置的话,以默认方式进行排序,就是以字母顺序进行排序,准确的讲就是按照字符编码的顺序进行排序。 var arr [3,2,3,34,1…...
泰克Tektronix DPO5204B混合信号示波器
特征 带宽:2 GHz输入通道:4采样率:1 或 2 个通道上为 5 GS/s、10 GS/s记录长度:所有 4 个通道 25M,50M:1 或 2 个通道上升时间:175 皮秒MultiView zoom™ 记录长度高达 250 兆点>250,000 wf…...
突破传统监测模式:业务状态监控HM的新思路
作者:京东保险 管顺利 一、传统监控系统的盲区,如何打造业务状态监控。 在系统架构设计中非常重要的一环是要做数据监控和数据最终一致性,关于一致性的补偿,已经由算法部的大佬总结过就不在赘述。这里主要讲如何去补偿ÿ…...
0Ω电阻在PCB板中的5大常见作用
在PCB板中,时常见到一些阻值为0Ω的电阻。我们都知道,在电路中,电阻的作用是阻碍电流,而0Ω电阻显然失去了这个作用。那它存在于PCB板中的原因是什么呢?今天我们一探究竟。 1、充当跳线 在电路中,0Ω电阻…...
分布式消息队列Kafka(三)- 服务节点Broker
1.Kafka Broker 工作流程 (1)zookeeper中存储的kafka信息 1)启动 Zookeeper 客户端。 [zrclasshadoop102 zookeeper-3.5.7]$ bin/zkCli.sh 2)通过 ls 命令可以查看 kafka 相关信息。 [zk: localhost:2181(CONNECTED) 2]…...
蠕动泵说明书_RDB
RDB_2T-S蠕 动 泵 概述 蠕动灌装泵是一种高性能、高质量的泵。采用先进的微处理技术及通讯方式做成的控制器和步进电机驱动器,配以诚合最新研制出的泵头,使产品在稳定性、先进性和性价比上达到一个新的高度。适用饮料、保健品、制药、精细化工等诸流量…...
浅谈react如何自定义hooks
react 自定义 hooks 简介 一句话:使用自定义hooks可以将某些组件逻辑提取到可重用的函数中。 自定义hooks是一个从use开始的调用其他hooks的Javascript函数。 下面以一个案例: 新闻发布操作,来简单说一下react 自定义 hooks。 不使用自定义hooks时 …...
如何优雅的写个try catch的方式!
软件开发过程中,不可避免的是需要处理各种异常,就我自己来说,至少有一半以上的时间都是在处理各种异常情况,所以代码中就会出现大量的try {...} catch {...} finally {...} 代码块,不仅有大量的冗余代码,而…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
