Linux信号处理解析:从入门到实战


Linux信号处理全解析:从入门到实战

一、初识Linux信号:系统级的"紧急电话"

  1. 信号是什么?
    信号是Linux系统中进程间通信的"紧急通知",如同现实中的交通信号灯。当用户按下Ctrl+C(产生SIGINT信号)时,相当于给程序发送了"立即停车"的指令。

  2. 常见信号速查表(精简版)
    | 信号编号 | 名称 | 触发方式 | 默认行为 |
    |----------|-----------|------------------------|------------------------|
    | 1 | SIGHUP | 终端断开 | 终止进程 |
    | 2 | SIGINT | Ctrl+C | 终止进程 |
    | 9 | SIGKILL | kill -9 | 强制终止 |
    | 15 | SIGTERM | 默认终止信号 | 优雅终止 |
    | 17 | SIGCHLD | 子进程状态改变 | 通知父进程 |

生活案例:SIGTERM(15)如同礼貌的停车请求,SIGKILL(9)则是拖车强制拖走。


二、信号操作入门:从命令行到代码

  1. 终端操作双雄:kill vs killall
优雅终止nginx进程(发送SIGTERM)
$ kill 1234 强制终止所有python进程 
$ killall -9 python 查看信号列表 
$ kill -l 

对比项:

  • kill:精确打击(需知道PID)
  • killall:范围清除(按进程名称)
  1. 编程基础:发送信号的两种姿势
// 发送信号给其他进程 
kill(pid, SIGTERM);// 给自己发送信号 
raise(SIGINT);

实验场景:创建父子进程,通过SIGCHLD实现僵尸进程回收(代码示例见附录A)


三、信号处理进阶:从接收到响应

  1. 信号处理三剑客
// 简单注册(传统方式)
signal(SIGINT, handler);// 高级注册(推荐方式)
struct sigaction sa;
sa.sa_handler = handler;
sigaction(SIGINT, &sa, NULL);

对比实验:

  • 连续快速按Ctrl+C时,signal可能丢失信号,而sigaction能正确捕获
  1. 定时器实战:闹钟与秒表
alarm(5);  // 5秒后触发SIGALRM 
ualarm(500000, 1000000); // 0.5秒后首次触发,之后每1秒触发 // 高精度定时器 
struct itimerval timer = {{2, 500000},  // 每2.5秒重复 {1, 0}        // 首次1秒后触发 
};
setitimer(ITIMER_REAL, &timer, NULL);

应用场景:实现精准心跳检测(误差<1ms)


四、信号控制艺术:精确管理的秘诀

  1. 信号集操作四部曲
sigset_t set;
sigemptyset(&set);          // 初始化空集合 
sigaddset(&set, SIGINT);    // 添加SIGINT 
sigprocmask(SIG_BLOCK, &set, NULL); // 阻塞信号 
sigpending(&set);           // 查看待处理信号 
  1. 信号屏蔽的三种策略
    | 策略 | 效果 | 适用场景 |
    |--------------|--------------------------------|------------------------|
    | 完全阻塞 | 信号永不递送 | 关键代码段保护 |
    | 临时阻塞 | 延迟信号处理 | 事务操作 |
    | 选择性接收 | 通过sigsuspend控制 | 高并发事件处理 |

五、sigsuspend的原子魔法:解决世纪难题

  1. 传统方案的致命缺陷
sigprocmask(SIG_UNBLOCK, &set, NULL); // 解除阻塞 
pause(); // 这里可能永远阻塞!
  1. sigsuspend的原子化操作
sigset_t mask;
sigfillset(&mask);
sigsuspend(&mask); // 原子化:解除阻塞+等待信号 

原理图解:

[初始状态] -> [保存掩码] -> [设置新掩码] -> [等待信号]↑                                  |+--------[恢复原始掩码]←-----------+
  1. 实战案例:安全信号等待器
void handler(int sig) {printf("Received %d\n", sig);
}int main() {struct sigaction sa;sigset_t mask;sigemptyset(&mask);sigaddset(&mask, SIGINT);sigprocmask(SIG_BLOCK, &mask, NULL);sa.sa_handler = handler;sigaction(SIGINT, &sa, NULL);while(1) {printf("Waiting...\n");sigsuspend(&mask); // 安全等待信号 }
}

六、性能优化与避坑指南

  1. 信号处理黄金法则

  2. 精简处理函数:避免调用非异步安全函数

  3. 使用volatile变量:保证标志位的可见性

  4. 优先选择sigaction:确保可靠性和可移植性

  5. 注意信号队列:实时信号(SIGRTMIN+)支持排队

  6. 多线程慎用:每个线程有独立信号掩码

  7. 常见问题解决方案
    | 问题现象 | 解决方案 |
    |------------------------|------------------------------|
    | 僵尸进程堆积 | SIGCHLD+wait组合拳 |
    | 服务无法正常关闭 | 捕获SIGTERM实现优雅退出 |
    | 定时任务执行滞后 | 使用setitimer提高精度 |
    | 信号处理函数被重复调用 | 设置SA_NODEFER标志 |


附录A:僵尸进程回收代码示例

// SIGCHLD处理示例 
void sigchld_handler(int sig) {while(waitpid(-1, NULL, WNOHANG) > 0);
}int main() {struct sigaction sa;sa.sa_handler = sigchld_handler;sigaction(SIGCHLD, &sa, NULL);if(fork() == 0) {// 子进程逻辑 exit(0);}while(1) pause();
}

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

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

相关文章

Java的Selenium的特殊元素操作与定位之select下拉框

如果页面元素是一个下拉框&#xff0c;我们可以将此web元素封装为Select对象 Select selectnew Select(WebElement element); Select对象常用api select.getOptions();//获取所有选项select.selectBylndex(index);//根据索引选中对应的元素select.selectByValue(value);//选…

蓝桥云客 刷题统计

刷题统计 问题描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目&#xff0c;周六和周日每天做 b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几天实现做题数大于等于 n 题&#xff1f; 输入格式 输入一行包含三个整数 a, b 和 …

三防笔记本有什么用 | 三防笔记本有什么特别

在现代社会&#xff0c;随着科技的不断进步&#xff0c;笔记本电脑已经成为人们工作和生活的重要工具。然而&#xff0c;在一些特殊的工作环境和极端条件下&#xff0c;普通笔记本电脑往往难以满足需求。这时&#xff0c;三防笔记本以其独特的设计和卓越的性能&#xff0c;成为…

智能体和RPA都需要程序思维,如何使用影刀的变量?

欢迎来到涛涛聊AI&#xff0c; 不管AI还是RPA&#xff0c;都需要用到编程思想才能完成批量工作。今天研究了下影刀的变量。 变量类型 根据变量值选择相应的类型&#xff0c;可选择任意一种影刀所支持的数据类型 变量值 指定变量中保存的值&#xff0c;会根据不同的类型设置…

【蓝桥杯】算法笔记3

1. 最长上升子序列(LIS) 1.1. 题目 想象你有一排数字,比如:3, 1, 2, 1, 8, 5, 6 你要从中挑出一些数字,这些数字要满足两个条件: 你挑的数字的顺序要和原来序列中的顺序一致(不能打乱顺序) 你挑的数字要一个比一个大(严格递增) 问:最多能挑出多少个这样的数字? …

性能测试之jmeter的基本使用

简介 Jmeter是Apache的开源项目&#xff0c;基于Java开发&#xff0c;主要用于进行压力测试。 优点&#xff1a;开源免费、支持多协议、轻量级、功能强大 官网&#xff1a;https://jmeter.apache.org/index.html 安装 安装步骤&#xff1a; 下载&#xff1a;进入jmeter的…

【NLP 面经 7、常见transformer面试题】

目录 1. 为何使用多头注意力机制&#xff1f; 2. Q和K使用不同权重矩阵的原因 3. 选择点乘而非加法的原因 4. Attention进行scaled的原因 5. 对padding做mask操作 6. 多头注意力降维原因 7. Transformer Encoder模块简介 8. 乘以embedding size的开方的意义 9. 位置编码 10. 其…

【深度学习】CNN简述

文章目录 一、卷积神经网络&#xff08;CNN&#xff09;二、CNN结构特性1. CNN 典型结构2. 局部连接3. 权重共享4.空间或时间上的次采样 三、理解层面 一、卷积神经网络&#xff08;CNN&#xff09; 卷积神经网络(Convolutional Neural Network&#xff0c;CNN)是一种用于处理…

理解OSPF 特殊区域NSSA和各类LSA特点

本文基于上文 理解OSPF Stub区域和各类LSA特点 在理解了Stub区域之后&#xff0c;我们再来理解一下NSSA区域&#xff0c;NSSA区域用于需要引入少量外部路由&#xff0c;同时又需要保持Stub区域特性的情况 一、 网络总拓扑图 我们在R1上配置黑洞路由&#xff0c;来模拟NSSA区域…

论文阅读笔记:Denoising Diffusion Implicit Models (5)

0、快速访问 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08;1&#xff09; 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08;2&#xff09; 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08…

蓝桥杯2024年第十五届省赛真题-R 格式

题目链接&#xff1a; 思路&#xff1a; 通过数组模拟d的每一位&#xff0c;逐位进行计算&#xff0c;从而实现对d的精确处理。 代码&#xff1a; #include<bits/stdc.h> #define int long long using namespace std; const int N 2020;int n; string s; vector<i…

深入探索 Linux Top 命令:15 个实用示例

在 Linux 系统管理中&#xff0c;top 命令是系统性能监控不可或缺的工具。它能够实时显示系统的 CPU、内存、进程等资源的使用情况&#xff0c;帮助您快速识别性能瓶颈和异常进程。本文将详细介绍 15 个实用的 top 命令使用示例&#xff0c;旨在帮助您更高效地进行系统管理与优…

15.1linux设备树下的platform驱动编写(知识)_csdn

上一章我们详细的讲解了 Linux 下的驱动分离与分层&#xff0c;以及总线、设备和驱动这样的驱动框架。基于总线、设备和驱动这样的驱动框架&#xff0c; Linux 内核提出来 platform 这个虚拟总线&#xff0c;相应的也有 platform 设备和 platform 驱动。 上一章我们讲解了传统的…

Eclipse 视图(View)

Eclipse 视图(View) Eclipse 视图(View)是 Eclipse 界面的重要组成部分,它提供了用户交互的平台,使得用户可以通过图形界面来编辑、调试、分析代码等。在本文中,我们将深入探讨 Eclipse 视图的功能、使用方法以及它们在软件开发中的作用。 1. 视图的功能 Eclipse 视图具…

Python解决“数字插入”问题

Python解决“数字插入”问题 问题描述测试样例解题思路代码 问题描述 小U手中有两个数字 a 和 b。第一个数字是一个任意的正整数&#xff0c;而第二个数字是一个非负整数。她的任务是将第二个数字 b 插入到第一个数字 a 的某个位置&#xff0c;以形成一个最大的可能数字。 你…

ubuntu部署ollama+deepseek+open-webui

ubuntu部署ollamadeepseekopen-webui 全文-ubuntu部署ollamadeepseekopen-webui 大纲 Ollama部署 安装Ollama&#xff1a;使用命令apt install curl和curl -fsSL https://ollama.com/install.sh | sh ollama-v网络访问配置&#xff1a;设置环境变量OLLAMA_HOST0.0.0.0:11434&…

Java的Selenium常用的元素操作API

click 触发当前元素的点击事件 clear() 清空内容 sendKeys(...) 往文本框一类元素中写入内容 getTagName() 获取元素的的标签名 getAttribute(属性名) 根据属性名获取元素属性值 getText() 获取当前元素的文本值 isDisplayed() 查看元素是否显示 get(String url) 访…

洛谷题单3-P1035 [NOIP 2002 普及组] 级数求和-python-流程图重构

题目描述 已知&#xff1a; S n 1 1 2 1 3 … 1 n S_n 1\dfrac{1}{2}\dfrac{1}{3}…\dfrac{1}{n} Sn​121​31​…n1​。显然对于任意一个整数 k k k&#xff0c;当 n n n 足够大的时候&#xff0c; S n > k S_n>k Sn​>k。 现给出一个整数 k k k&#xff0…

CMDB平台(进阶篇):3D机房大屏全景解析

在数字化转型的浪潮中&#xff0c;数据中心作为企业信息架构的核心&#xff0c;其高效、智能的管理成为企业竞争力的关键因素之一&#xff0c;其运维管理方式也正经历着革命性的变革。传统基于二维平面图表的机房监控方式已难以满足现代企业对运维可视化、智能化的需求。乐维CM…

小白速通:Verilog流水线实现及时序分析

目录 题目&#xff1a;时序分析&#xff1a;时钟频率为50MHz数据1: a10, b20, c30, d40, e2数据2: a5, b15, c25, d35, e3数据3: a8, b12, c16, d24, e4 流水线效率分析 题目&#xff1a; verilog中&#xff0c;y(abcd)*e&#xff0c;时钟频率为50Mhz&#xff0c;用流水线的形式…