信号的保存、阻塞与递达

文章目录

信号的保存

在 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

相关推荐
旖-旎1 小时前
深搜练习(组合总和)(7)
c++·算法·深度优先·力扣
T0uken1 小时前
基于 vcpkg 与 LLVM-MinGW 的 Qt6 静态链接开发方案
c++·windows·qt
睡一觉就好了。1 小时前
C++11(一)
c++
进阶的猪1 小时前
使用printk对SPI子系统全过程的追踪
linux·服务器
2301_803554522 小时前
Linux里面的文件描述符和windows里面的句柄
linux·运维·服务器
水云桐程序员2 小时前
C++的主要应用场景
c++·学习方法
星马梦缘2 小时前
如何切换window-ubuntu双系统【方案一】
linux·ubuntu·双系统
idolao2 小时前
CentOS 7 安装 jakarta-tomcat-connectors-jk2-src-current.tar.gz 详细步骤(解压、编译、配置)
linux·centos·tomcat
时空自由民.3 小时前
蓝牙协议栈介绍
linux·网络·单片机