【Linux】Linux 进程信号核心拆解:pending/block/handler 三张表 + signal/alarm 实战

【Linux】Linux 进程信号核心拆解:pending/block/handler 三张表 + signal/alarm 实战

前言:欢迎各位光临本博客,这里小编带你直接手撕**,文章并不复杂,愿诸君**耐其心性,忘却杂尘,道有所长!!!!

在这里插入图片描述

IF’Maxue个人主页
 🔥 个人专栏:
《C语言》
《C++深度学习》
《Linux》
《数据结构》
《数学建模》

⛺️生活是默默的坚持,毅力是永久的享受。不破不立!

文章目录

Linux进程信号详解

信号与信号量的区别

信号和信号量,就像“老婆”和“老婆饼”——没有任何关系。

信号的概念

什么是信号?

信号是一种给进程发送的异步事件通知机制。简单说,就是能“打断”进程正在做的事,让进程去处理这个通知。

比如生活中,你正在上课(进程运行),快递员敲门(信号产生),你需要暂停上课去处理快递(进程处理信号)。这里的关键是:快递员啥时候来不确定(信号异步产生),但你知道该怎么接快递(进程提前知道信号处理方式)。

image.png

基本结论

  1. 进程在信号产生前,就已经知道该怎么处理(提前“学会”了)。
  2. 信号不是立即处理,而是等进程到“合适的时机”再处理。
  3. 进程对信号的识别和处理方式,是操作系统设计时就确定好的。
  4. 信号的来源很多(键盘、系统调用、异常等)。

信号的产生方式

1. 键盘产生(仅前台进程)

键盘操作能给前台进程发信号,比如ctrl+c

ctrl+c实际发送的是2号信号(SIGINT),默认处理动作是终止进程。

image.png

kill -l可查看所有信号,1-31是普通信号(进程择时处理),34-64是实时信号(立即处理)。

image.png
信号的处理方式

进程处理信号有3种方式:

  • 默认动作(比如大部分信号默认终止进程);
  • 自定义动作(用代码修改处理逻辑);
  • 忽略(收到信号不做任何处理)。
image.png
用signal函数自定义信号处理

signal函数可以修改信号的默认处理动作,格式如下:

image.png

示例代码:

image.png

运行结果:ctrl+c不再终止进程,而是打印提示,因为我们把2号信号的处理动作改成了自定义函数。

image.png
前台与后台进程
  • 前台进程:直接运行(./xxx),能接收键盘信号(如ctrl+c)。
  • 后台进程:加&运行(./xxx &),不接收键盘信号,需用kill命令终止。
  • jobs查看后台任务,fg 1将后台任务1转为前台,ctrl+z将前台进程转后台,bg 1让后台进程继续运行。
image.png


image.png

2. 系统调用产生信号

发送信号的本质是修改进程内核数据结构(task_struct)中的信号位图(记录收到的信号)。操作系统提供了多个系统调用用于发送信号。

kill函数

给指定进程发信号,格式:

image.png

示例:给PID为1234的进程发9号信号(强制终止):kill(1234, 9)

image.png
raise函数

进程给自己发信号,示例代码:

image.png

运行结果:进程给自己发9号信号后终止(9号信号无法被自定义处理)。

image.png
abort函数

让进程自己终止,固定发送6号信号(SIGABORT),且会忽略自定义处理(强制用默认动作)。

image.png


运行结果:进程收到6号信号后终止。

image.png

3. 异常产生信号

程序运行出错时,操作系统会给进程发信号,导致进程崩溃。

除0错误

代码:

image.png

结果:触发8号信号(SIGFPE,浮点数错误),进程终止。

image.png
野指针错误

代码:

image.png

结果:触发11号信号(SIGSEGV,段错误),进程终止。

image.png
为什么操作系统会发信号?

操作系统是软硬件管理者,能检测CPU寄存器状态(如除0时的溢出标志)、内存访问错误(如野指针访问无效地址),一旦检测到,就给对应进程发信号。

4. 软件条件产生信号

某些软件场景会触发信号,比如管道读写错误、闹钟超时等。

alarm函数(闹钟)

给进程设置闹钟,时间到后操作系统发送14号信号(SIGALRM)。

  • 格式:unsigned int alarm(unsigned int seconds);
  • 功能:alarm(5)表示5秒后发SIGALRM;alarm(0)取消闹钟。
  • 返回值:上一个闹钟剩余的秒数(无则返回0)。
image.png

示例1:自定义处理SIGALRM
代码:

image.png

结果:5秒后收到14号信号,执行自定义打印。

image.png

示例2:重复闹钟
代码:在信号处理函数中重新设置闹钟,实现每秒触发一次。

image.png

结果:每秒打印一次提示。

image.png
pause函数

让进程暂停,直到收到一个信号才继续运行。

代码:结合alarm和pause,实现定时任务。

image.png

结果:每1秒执行一次任务。

image.png

操作系统如何管理闹钟?

操作系统用“先描述再组织”的方式管理多个闹钟:

  • 用类似“最小堆”的结构组织,堆顶是最早超时的闹钟,定期检查,超时则给进程发SIGALRM。

每个闹钟用结构体描述(包含目标进程、超时时间等)。

image.png
image.png

信号的保存

进程收到信号后不会立即处理,而是先保存起来。保存信号依赖三张“表”:pending(未决信号集)、block(阻塞信号集)、handler(处理函数集)。

image.png

三张表的作用

  • pending(未决信号集):位图,记录进程收到了哪些信号(比特位1表示收到,0表示未收到)。
  • block(阻塞信号集):位图,记录哪些信号被“屏蔽”(比特位1表示阻塞,此时即使pending有该信号,也不会处理)。
  • handler(处理函数集):函数数组,记录每个信号的处理方式(默认、忽略、自定义函数)。
image.png


image.png

信号集操作函数

Linux提供函数操作这三张表,核心是sigset_t(信号集类型,类似位图)。

image.png


image.png
常用函数
  • sigemptyset:初始化信号集为空(所有比特位0)。
  • sigfillset:初始化信号集为满(所有比特位1)。
  • sigaddset:向信号集添加某个信号(置位)。
  • sigdelset:从信号集删除某个信号(清位)。
  • sigismember:判断信号是否在信号集中。
image.png
sigprocmask:修改block表

用于设置进程的阻塞信号集(block表)。

image.png
sigpending:获取pending表

获取当前未决的信号集(pending表)。

image.png

整合示例

代码:阻塞2号信号,发送信号后查看pending表,再解除阻塞观察处理结果。

image.png


image.png

结果:

  • 阻塞期间,ctrl+c(2号信号)被记录在pending表(显示有未决信号)。
  • 解除阻塞后,信号被处理(执行自定义函数),pending表中对应位清0。
image.png

信号的处理

信号处理的时机:进程从内核态返回用户态时,会检查pending表中未被阻塞的信号,按handler表的方式处理。

处理流程:

  1. 检查pending表,找到未被block的信号。
  2. 清空该信号在pending表中的位(1→0)。
  3. 执行handler表中对应的处理动作(默认、忽略、自定义函数)。
image.png

补充知识

信号的重复产生

普通信号(1-31)多次产生时,pending表中只会记录一次(位图位只能是1);实时信号(34-64)会按顺序处理多次。

image.png

Core与Term的区别

进程终止的两种默认动作:

  • Term:直接终止进程,不保留现场。
  • Core:终止进程并生成core文件(核心转储),保存进程崩溃时的内存状态,用于调试。
image.png
开启Core dump

默认情况下,很多系统关闭了Core dump(避免占用空间),可通过ulimit临时开启:

  • ulimit -c unlimited:开启Core dump(不限制大小)。

ulimit -a:查看当前限制(core file size为0表示关闭)。

image.png
使用core文件调试

进程崩溃生成core文件后,可用gdb调试:
gdb ./程序名 core,直接定位到出错行。

image.png

进程终止总结

image.png


image.png


image.png

Read more

Agent实习模拟面试之Dify + Skill本地部署大模型智能体:从零构建企业级可落地的AI Agent系统

Agent实习模拟面试之Dify + Skill本地部署大模型智能体:从零构建企业级可落地的AI Agent系统 摘要:本文以一场高度仿真的Agent实习生岗位模拟面试为载体,聚焦当前热门的低代码Agent开发平台 Dify 与 自定义Skill(技能)机制,深入探讨如何在完全本地化环境中部署一个安全、可控、可扩展的大模型智能体(Agent)。通过“面试官提问—候选人回答—连环追问”的对话形式,系统性地拆解了Dify的核心架构、Skill插件开发、本地大模型集成(如Llama-3、Qwen)、RAG优化、权限控制、监控告警等关键环节,并结合企业实际场景(如内部知识问答、自动化办公)给出完整落地路径。全文超过9500字,适合对AI Agent开发、私有化部署、企业智能化转型感兴趣的工程师、架构师与在校学生阅读。 引言:为什么企业需要“本地部署的Dify + 自定义Skill”? 在2024–2026年的大模型应用浪潮中,一个显著趋势是:企业不再满足于调用公有云API,而是强烈要求数据不出域、模型可审计、能力可定制的私有化Agent解决方案。

By Ne0inhk
人工智能:计算机视觉的基础与应用

人工智能:计算机视觉的基础与应用

第十二篇:计算机视觉的基础与应用 学习目标 💡 理解计算机视觉的基本概念和重要性 💡 掌握计算机视觉中的图像处理技术、特征提取方法、常用模型与架构 💡 学会使用计算机视觉库(OpenCV、PIL、PyTorch、TensorFlow)进行图像处理、特征提取和模型训练 💡 理解图像分类、目标检测、语义分割等任务的实现方法 💡 通过实战项目,开发一个完整的计算机视觉应用 重点内容 * 计算机视觉的基本概念 * 图像处理技术(图像预处理、增强、滤波) * 特征提取方法(HOG、SIFT、ORB) * 常用模型与架构(LeNet、AlexNet、VGG、ResNet、YOLO) * 实战项目:计算机视觉应用开发(图像分类、目标检测等) 一、计算机视觉基础 1.1 计算机视觉的基本概念 计算机视觉(Computer Vision)是人工智能的一个重要分支,它涉及计算机与图像之间的交互。其目标是让计算机能够理解和解释图像内容,

By Ne0inhk

全球与中国当前主流的 人工智能(AI)公司与机构介绍:截止2026年2月

以下是截至 2026 年 全球与中国当前主流的 人工智能(AI)公司与机构 全面介绍,从 技术研发、模型能力、产业应用、市场影响力 等维度整理,便于理解当前行业格局: 🌐 一、全球领先的AI科技巨头与组织 1. OpenAI(美国) — 生成式AI先驱 * 代表产品:GPT 系列(如 GPT-4x / GPT-4o 等)、ChatGPT * 主要贡献:推动大语言模型(LLM)和通用智能技术商业化,深度影响搜索、办公自动化、对话AI等场景 * 合作关系:与微软深度合作,其模型集成于 Azure 和 Copilot 服务中。 2. Google DeepMind & Google AI(美国

By Ne0inhk
私人 AI 随身带!OpenClaw+cpolar 外网访问完整教程

私人 AI 随身带!OpenClaw+cpolar 外网访问完整教程

前言 在人人都用 AI 的时代,拥有一台完全私有、本地运行、数据不泄露的私人 AI,已经成为很多人的刚需。OpenClaw 就是这样一款宝藏工具,可绝大多数人都用错了方式 —— 只把它放在家里电脑上,出门就用不了。结果就是:部署时兴致勃勃,用几天后慢慢闲置,明明花了时间搭建,却没能发挥一半价值。我自己踩过这个坑,也试过各种办法突破局域网限制,要么配置复杂,要么不稳定,直到遇见 cpolar。它能轻松把本地服务映射到公网,安全加密、多平台兼容、新手友好。把 OpenClaw 和 cpolar 组合在一起,就等于把私人 AI 装进口袋,上班、出差、旅行,只要有网就能用。这篇文章不讲难懂原理,只给可直接复制的操作,带你从零完成外网访问,让私人 AI 真正随身带、随时用。 1 OpenClaw和cpolar是什么?

By Ne0inhk