一篇文章带你快速了解linux中关于信号的核心内容
1. 信号概念
信号是操作系统用来通知进程某个特定事件已经发生的一种方式。它们是一种软件中断,可以被发送到进程以对其进行异步通知。
2. 信号处理的三种方式
- 执行默认动作
- 执行自定义动作
- 忽略
signal() 函数:将信号处理设置为 SIG_IGN,可以忽略信号
signal(sig, SIG_IGN);
sigaction() 函数:将 sa_handler 设置为 SIG_IGN。
struct sigaction act;
act.sa_handler = SIG_IGN;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(sig, &act, NULL);
3. 系统定义的信号列表
131表示为常规信号,3264表示为实时信号
常规信号不需要排队,实时信号需要排队。
如果一个常规信号在短时间内多次产生,而进程正在处理前一个该信号,那么后续的相同信号通常会被丢弃,只保证至少有一个信号被传递给进程。
如果有多个相同的实时信号发送给一个进程,它们会被排队,直到进程有机会处理它们。这意味着进程可以按顺序处理所有接收到的实时信号,不会丢失任何信号。
| 信号编号 | 信号名词 | 信号用途 |
|---|---|---|
| 1 | SIGHUP | 通常在控制终端关闭时发送给前台进程组的所有进程,用于提示程序重新读取配置文件或优雅地重启 |
| 2 | SIGINT | 由用户发送,通常通过按下 Ctrl+C,请求程序中断当前操作 |
| 3 | SIGQUIT | 由用户发送,通常通过按下 Ctrl+\,请求程序停止并产生核心转储,用于调试 |
| 4 | SIGILL | 当程序尝试执行非法指令时发送,指示程序存在严重错误 |
| 5 | SIGTRAP | 由断点指令或trace调用触发,用于调试 |
| 6 | SIGABRT | 由 abort() 函数调用触发,请求程序异常终止并产生核心转储 |
| 7 | SIGBUS | 当程序试图访问一个无法访问的内存地址时发送,指示总线错误 |
| 8 | SIGFPE | 浮点异常信号,如算术溢出、除以零等 |
| 9 | SIGKILL | 用于立即终止进程,无法被捕获或忽略 |
| 10 | SIGUSR1 | 用户自定义信号,可以用于进程间通信 |
| 11 | SIGSEGV | 段错误信号,当程序试图访问其内存空间中未分配或无法访问的内存时发送 |
| 12 | SIGUSR2 | 用户自定义信号,可以用于进程间通信 |
| 13 | SIGPIPE | 当写入一个已被另一端关闭的管道时发送 |
| 14 | SIGALRM | 计时器信号,由 alarm() 函数设置的计时器超时触发 |
| 15 | SIGTERM | 终止信号,请求进程自行终止,是最常用的终止信号 |
| 16 | SIGSTKFLT | 协处理器栈故障,不常用 |
| 17 | SIGCHLD | 子进程结束或停止信号,用于通知父进程子进程的状态改变 |
| 18 | SIGCONT | 继续信号,用于将一个被停止的进程恢复执行 |
| 19 | SIGSTOP | 停止信号,用于暂停进程的执行,无法被捕获或忽略 |
| 20 | SIGTSTP | 用户停止信号,通常由用户通过 Ctrl+Z 触发 |
| 21 | SIGTTIN | 后台进程组试图从前台进程组控制的终端读取 |
| 22 | SIGTTOU | 后台进程组试图向前台进程组控制的终端写入 |
| 23 | SIGURG | 有紧急数据可读,通常用于网络编程 |
| 24 | SIGXCPU | CPU时间限制超信号,当进程超过其CPU时间限制时发送 |
| 25 | SIGXFSZ | 文件大小限制超信号,当进程试图扩大超过其文件大小限制的文件时发送 |
| 26 | SIGVTALRM | 虚拟时钟超时信号,类似于 SIGALRM,但是计算的是进程占用 CPU 的时间 |
| 27 | SIGPROF | 性能分析信号,用于性能分析和监视 |
| 28 | SIGWINCH | 窗口变化信号,当终端的窗口大小发生变化时发送 |
| 29 | SIGIO | 输入/输出可用信号,用于异步I/O |
| 30 | SIGPWR | 电源恢复信号,用于通知设备电源状态变化 |
| 31 | SIGSYS | 坏系统调用信号,当执行了无法识别的系统调用时发送 |
4. 信号的产生
4.1 通过终端按键产生信号
当用户在终端按键时(如 Ctrl+C 或 Ctrl+Z),终端驱动程序会捕捉到这个按键事件,并将其转换为相应的信号。
4.2 调用系统函向进程发信号
kill函数可以给一个指定的进程发送指定的信号
int kill(pid_t pid, int signo);//成功返回0,错误返回-1
raise函数可以给当前进程发送指定的信号(自己给自己发信号)
int raise(int signo);//成功返回0,错误返回-1
abort函数使当前进程接收到信号而异常终止
void abort(void);//abort函数总是会成功的,所以没有返回值
4.3 由软件条件产生信号
常见的软件条件:
- 异常(SIGFPE、SIGSEGV)
- 主动终止(SIGABRT)
- 调试信息(SIGTRAP)
- 自定义行为(SIGUSR1、SIGUSR2)
信号的生成和处理:
使用系统调用
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>int main() {// 主动触发 SIGABRT 信号abort();return 0;
}
捕捉和处理
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>void handle_sigint(int sig) {printf("Caught signal %d\n", sig);exit(0);
}int main() {signal(SIGINT, handle_sigint); // 捕获 Ctrl+Cwhile (1) {printf("Running...\n");sleep(1);}return 0;
}
4.4 硬件异常产生信号
在 Linux 中,硬件异常是指由计算机硬件引发的事件,这些事件通常会导致当前执行的程序无法继续正常运行。
硬件异常的常见问题:
非法指令:程序尝试执行未定义或不合法的指令
段错误:程序访问了未分配给它的内存区域
浮点异常:发生除以零、溢出等浮点运算错误
总线错误:由于对未对齐地址或无效地址进行访问而导致的错误
例如:
int main() {int *ptr = NULL;*ptr = 42; // 尝试写入 NULL 指针return 0;}
在这种情况下,CPU 检测到非法内存访问并生成 SIGSEGV 信号。操作系统捕获该信号并终止该进程,同时可能生成核心转储文件用于后续调试。
相关文章:
一篇文章带你快速了解linux中关于信号的核心内容
1. 信号概念 信号是操作系统用来通知进程某个特定事件已经发生的一种方式。它们是一种软件中断,可以被发送到进程以对其进行异步通知。 2. 信号处理的三种方式 执行默认动作执行自定义动作忽略 signal() 函数:将信号处理设置为 SIG_IGN,可…...
openEuler、Linux操作系统常见操作-(6)如何登录Linux
如何登录Linux Linux登陆方式主要有如下两种: 。本地登陆 。一个典型的Linux系统将运行六个虚拟控制台和一个图形控制台,openEuler目前暂未支持图形化界面; 可以通过CtrlAltF[1-6]在6个虚拟控制台之间进行切换。 远程登录 。默认情况下openEuler支持远程登录&…...
Python基础语法条件
注释 注释的作用 通过用自己熟悉的语言,在程序中对某些代码进行标注说明,这就是注释的作用,能够大大增强程序的可读性。 注释的分类及语法 注释分为两类:单行注释 和 多行注释。 单行注释 只能注释一行内容,语法如下…...
006-MAVEN 的使用
MAVEN 的使用 一、依赖范围二、依赖的传递性三、依赖的原则四、依赖的排除 一、依赖范围 在引入log4j 依赖的时候,有一个scope设置,这个scope设置的值就是对应的依赖范围(因为compile 是默认的依赖范围,所以有时也可以省略)。 Maven 提供了…...
npm使用时报错:Could not retrieve https://npm.taobao.org/mirrors/node/index.json.
在使用npm时报错,报错信息如下: 报错的原因:是原来的淘宝镜像地址过期了 解决办法:修改镜像地址。打开nvm的安装地址 -->settings.txt文件 -->配置下载源 1、将settings.txt文件中的 node_mirror: https://npm.taobao.or…...
软考中级网络工程师——高级配置
文章目录 IS-ISBGP(边境网关协议)-IBGP-EBGP配置BFD(双向转发侦测)与Router-Static联动BFD与OSPF联动BFD与VRRP(虚拟路由器冗余协议)联动VRRP配置(基于网关备份)FW基础配置FW高级配置DHCP路由策略 IS-IS 第一步:每一个路由设置环回口地址 第二部:配置接…...
Leetcode 第 141 场双周赛题解
Leetcode 第 141 场双周赛题解 Leetcode 第 141 场双周赛题解题目1:3314. 构造最小位运算数组 I思路代码复杂度分析 题目2:3315. 构造最小位运算数组 II思路代码复杂度分析 题目3:3316. 从原字符串里进行删除操作的最多次数思路代码复杂度分析…...
Linux性能调优,还可以从这些方面入手
linux是目前最常用的操作系统,下面是一些常见的 Linux 系统调优技巧,在进行系统调优时,需要根据具体的系统负载和应用需求进行调整,并进行充分的测试和监控,以确保系统的稳定性和性能。同时,调优过程中要谨…...
STM32的独立看门狗定时器(IWDG)技术介绍
在嵌入式系统中,确保系统的稳定性和可靠性至关重要。看门狗定时器(Watchdog Timer, WDT) 是一种常用的硬件机制,用于监控系统的运行状态,防止系统因软件故障或意外情况进入不可预期的状态。STM32系列微控制器提供了两种…...
自动化生成工作流?英伟达提出ComfyGen:通过LLM来匹配给定的文本提示与合适的工作流程
ComfyGen的核心在于通过LLM来匹配给定的文本提示与合适的工作流程。该方法从500个来自用户的多样化提示生成图像,随后使用一系列美学预测模型对生成结果进行评分。这些评分与相应的工作流程形成了一个训练集,包含提示、工作流程及其得分的三元组。 然后…...
indicatorTree-v10练习(有问题)
目标:设计数据库表表格式,将“indicatorTree-v10.json”导入到数据库,再从数据库读取写为JSON文件。 其他要求:数据库要求为mysql数据库;编程语言暂时限定为C;JSON解析使用本文件夹中的cJSON.c和cJSON.h&am…...
python源码:指定麦克风/音响播放歌曲
前言 我使用pygame实现了指定麦克风/音响播放歌曲的功能,主要目的是解决直播过程的多源声道控制问题。 代码 # 查看自己的音频设备 # 请记住目标音频设备的具体名称 import pygame as mixer import pygame._sdl2 as sdl2mixer.init() # Initialize the mixer, thi…...
基于华为云智慧生活生态链设计的智能鱼缸
一. 引言 1.1 项目背景 随着智能家居技术的发展和人们对高品质生活的追求日益增长,智能鱼缸作为一种结合了科技与自然美的家居装饰品,正逐渐成为智能家居领域的新宠。本项目旨在设计一款基于华为云智慧生活生态链的智能鱼缸,它不仅能够提供…...
OJ-1015图像物体的边界
分析 思路 1.输入读取:读取网格的维度(M,N)和像素值到一个二维数组中。 2.迭代:遍历二维数组中的每个单元格。 3.边界检测:对于每个像素值为1的单元格,检查其八个相邻的单元格。如果任何相邻单元格的像素值为5,则增加边界计数。 4,边界计数调整:由于每…...
RAG 入门实践:从文档拆分到向量数据库与问答构建
本文将使用 Transformers 和 LangChain,选择在 Retrieval -> Chinese 中表现较好的编码模型进行演示,即 chuxin-llm/Chuxin-Embedding。 你还将了解 RecursiveCharacterTextSplitter 的递归工作原理。 一份值得关注的基准测试榜单:MTEB (M…...
445: 选择问题
解法: 第k大的数据查找 a, b map(int, input().split()) l list(map(int, input().split())) l.sort() print(l[b-1])...
IP地址类型选择指南:动态IP、静态IP还是数据中心IP?
你是否曾经困惑于如何选择最适合业务需求的IP地址类型?面对动态IP、静态IP和数据中心IP这三种选择,你是否了解它们各自对你的跨境在线业务可能产生的深远影响? 在跨境电商领域,选择合适的IP类型对于业务的成功至关重要。动态IP、…...
基于Python flask的豆瓣电影可视化系统,豆瓣电影爬虫系统
博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不…...
面试不是一场遭遇战
引言 Ethan第一次跳槽时,把工作总结搞成简历,丢到BOSS,面了几场,结果都很糟。复盘下来,发现面试过程临场发挥太多,把攻坚战打成了遭遇战。 那面试要如何准备?什么情况下跳槽?有哪些大…...
【力扣 | SQL题 | 每日3题】力扣1795,1907,1398,602
1. 力扣1795:每个产品在不同商品的价格 1.1 题目: 表:Products ---------------------- | Column Name | Type | ---------------------- | product_id | int | | store1 | int | | store2 | int | | store3 …...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 ——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
