信号的保存、阻塞与递达

文章目录

信号的保存

在 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

相关推荐
qq_5434478217 分钟前
DNS解析怎么排查?故障处理与运维实用手册
运维·服务器·网络·php
DeviceHub19 分钟前
AI服务器电源设计进阶:TLVR电感的应用解析与选型验证指南
运维·服务器·人工智能
Apipi*20 分钟前
30天速通Linux 第七章进程间通信
linux·运维·服务器
emo_2b29 分钟前
Pycharm配置conda解释器时遇到的问题及解决方法
linux·pycharm·conda
程序员老陆36 分钟前
C++ 多线程通信方式全景:从共享内存到结构化协调
开发语言·c++
极光通讯1 小时前
服务器内存替代料选型方法论:主料号缺货时如何找到Pin-to-Pin兼容型号
运维·服务器
某不知名網友1 小时前
ROS2 核心通信:话题发布与订阅详解
开发语言·c++
C++ 老炮儿的技术栈1 小时前
char (*csConnectName)[256]; 和 char csConnectName [256] 有什么区别
java·c语言·开发语言·c++·人工智能·算法·c
人生百态,人生如梦1 小时前
Ubuntu在低版本下使用ccswitch+claudecode(CCSwitch+Docker+Claude)连调教程
linux·ubuntu·docker·claudecode·ccswitch
大鹏说大话1 小时前
C++ STL 容器怎么选?vector、list、map、unordered_map 对比
开发语言·c++·list