一篇文章带你快速了解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 …...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...