信号的保存、阻塞与递达

文章目录

信号的保存

在 Linux 信号机制中,完整的生命周期通常包括三个阶段:

  1. 信号产生(Signal Generation)
  2. 信号保存(Signal Pending / Signal Masking)
  3. 信号处理(Signal Handling)

此前已经介绍了信号产生的多种方式,例如:

  • 硬件异常
  • 软件条件
  • 键盘输入
  • 系统调用(如 kill)
  • 进程间通信
    需要注意的是:

无论信号由哪种方式触发,最终都必须由 操作系统内核 负责向目标进程发送信号。

用户程序并不能直接修改进程控制块(PCB),所有信号操作都必须通过系统调用进入内核完成。


信号递达(Signal Delivery)

定义

当进程实际执行某个信号对应的处理动作时,该过程称为:

信号递达(Signal Delivery)

信号递达可能对应以下几种行为:

  • 执行默认处理动作(如终止进程)
  • 调用用户自定义信号处理函数
  • 执行忽略操作
    例如:
text 复制代码
SIGINT → 执行用户自定义 handler
SIGTERM → 终止进程

上述实际执行处理逻辑的过程,即为 信号递达。


信号未决(Pending Signal)

在 Linux 中,信号并不是在产生后立即被处理。
定义

从信号产生到信号递达之间的状态,称为 未决状态(Pending)。

即:

复制代码
Signal Generated
        ↓
Pending (未决)
        ↓
Signal Delivered

因此,一个信号在系统中可能处于:

  • 已产生
  • 尚未处理
    的状态。
    该机制的原因在于:
  • 进程可能正在执行关键代码
  • 内核需要在合适的时机进行信号处理
    因此信号会被 暂时保存。

信号阻塞(Signal Blocking)

除了"未决状态"外,Linux 还允许进程主动 阻塞某些信号 。
定义

进程可以通过设置 信号屏蔽字(Signal Mask),使某些信号暂时无法被递达。

如果某个信号被阻塞:

  • 当该信号产生时
  • 不会立即被处理
  • 会一直保持在 Pending 状态

只有在 解除阻塞(Unblock) 后,该信号才可能被递达。

因此信号处理流程可以表示为:

复制代码
Signal Generated
        ↓
Pending
        ↓
(若被阻塞 → 保持 Pending)
        ↓
解除阻塞
        ↓
Signal Delivery

阻塞与忽略的区别

在信号处理机制中,阻塞(Block) 与 忽略(Ignore) 是两个完全不同的概念。

阻塞(Block)

特点:

  • 信号不会被递达

  • 信号会被保存在 Pending 状态

  • 解除阻塞后仍然可能被处理
    即:

    Signal Generated
    ↓
    Pending
    ↓
    Blocked
    ↓
    Unblock
    ↓
    Delivered

无信号时仍可设置阻塞

信号阻塞机制 并不依赖于信号是否已经产生 。

也就是说:

  • 即使当前没有任何信号
  • 进程仍然可以提前设置 阻塞某些信号
    当未来这些信号产生时:
  • 它们将直接进入 Pending 状态
  • 不会立即递达。

信号阻塞与进程阻塞的区别

需要区分两个容易混淆的概念:

概念 含义
进程阻塞(Process Blocking) 进程因等待资源进入阻塞状态
信号阻塞(Signal Blocking) 进程屏蔽某些信号

两者完全不同:
进程阻塞

复制代码
Running → Waiting → Ready

原因:

  • 等待 I/O

  • 等待锁

  • 等待资源
    信号阻塞

    Signal Masking

作用:

  • 控制哪些信号可以被递达
    因此:

信号阻塞与进程状态无关。


忽略(Ignore)

忽略是一种 信号处理方式 。

当信号递达时:

  • 系统执行的处理动作是 Ignore
    因此流程是:

    Signal Generated
    ↓
    Pending
    ↓
    Delivered
    ↓
    Ignore

也就是说:

忽略是 一种处理结果 ,而阻塞是 一种递达控制机制。


Pending 与 Block 的关系

需要注意:
Pending(未决) 与 Block(阻塞) 是两种完全不同的概念。

概念 含义
Pending 信号已经产生但尚未递达
Block 进程主动禁止该信号递达

它们之间可能存在组合关系:

  • 未阻塞信号 → 可以递达
  • 阻塞信号 → 会保持 Pending

相关推荐
小徐不徐说5 分钟前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
大都督会赢的14 分钟前
C++第一节课
开发语言·c++
UIU11416 分钟前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
Ruiery22 分钟前
Linux 6.6内核内存管理深度解析(十三):slab/slub 分配器
linux·运维·服务器
乌恩大侠1 小时前
从 AI-RAN 到 AI Agent:基于 NVIDIA Nemotron 构建 5G/6G 智能网络故障诊断系统
服务器·人工智能·5g·o-ru·ai-ran·电信大模型
TMedical1 小时前
MedPlanning 截骨模拟矫形功能
c++·图像处理·人工智能·qt·健康医疗
qq_406981031 小时前
共享变量一 关于extern与const
开发语言·c++
丰锋ff3 小时前
压缩命令笔记
linux
迪菲赫尔曼3 小时前
【基础篇 11】把官方源码放到服务器:版本、解压层级和安装位置,一次弄清楚
运维·服务器·开发语言·人工智能·python·yolo·目标检测
chari克里4 小时前
QT5.15.2 + msvc2022部署全流程说明(windows可联网环境)
开发语言·c++·qt