当前位置:首页 > 系统教程 > 正文

Linux进程信号详解(一):信号的产生与信号的保存

Linux进程信号详解(一):信号的产生与信号的保存

从零理解信号机制:产生、传递与阻塞

Linux进程信号详解(一):信号的产生与信号的保存 Linux信号 进程信号产生 信号保存 阻塞信号集 第1张

在Linux系统中,信号是一种软中断,用于通知进程发生了某个事件。本文是系列第一篇,重点讲解信号的产生信号的保存。即使你是初学者,也能轻松掌握。

一、信号的产生

信号可以由多种方式产生:

  • 硬件异常:如除零、非法内存访问,硬件检测到后通知内核产生相应信号(如SIGFPE、SIGSEGV)。
  • 软件条件:比如alarm定时器到期产生SIGALRM,或者通过kill函数向进程发送信号。
  • 终端操作:用户在终端按下Ctrl+C产生SIGINT,Ctrl+\产生SIGQUIT。
  • 进程间通信:通过kill、sigqueue系统调用明确发送信号。

无论哪种方式,最终都是由内核向目标进程的PCB中写入信号信息,这个过程称为信号的产生

二、信号的保存

信号产生后,并不会立即被处理,而是先保存在进程的PCB(task_struct)中。每个进程都有两个重要的信号集:阻塞信号集(block set)和未决信号集(pending set)。

  • 未决信号集:记录当前进程已经产生但尚未递送的信号。当信号产生时,对应的位图标记为1,表示未决。
  • 阻塞信号集:记录当前进程正在阻塞的信号。如果某个信号被阻塞,即使产生了未决信号,也不会递送,直到阻塞解除。

内核通过这两个位图实现信号保存。当进程从内核态返回用户态时,会检查未决信号集,如果存在未阻塞的信号,则执行对应的处理动作。

理解信号的产生与保存是深入学习Linux信号的基础。下一篇我们将讨论信号的递送与处理。