Linux 进程信号机制:产生方式与闹钟应用
理解信号是什么,为什么要有?
信号的本质
什么是通知?什么是异步?
- 通知:事件通知。
- 异步:通知的到来,与当前执行流不同步。例如点外卖后打游戏,外卖员敲门是通知,你和外卖员是不同步的。异步关系意味着各自独立运行;同步关系则需等待对方完成。
操作系统给目标进程发送信号,目标进程能否识别?答案是肯定的。进程和信号都是程序员设计的代码,进程天然能够识别信号并知道如何处理。
信号的处理方式
收到信号后,不会立即处理,只有在合适的时候才会处理。因此进程需要有临时保存信号的能力(位图)。
信号处理的动作有三种:
- 默认:如红灯停。
- 忽略:如收到信号但选择不处理。
- 自定义:如红灯亮时跳舞。
信号的保存
信号位图设计在进程的 PCB(进程控制块)里面。只有操作系统有资格修改内核数据结构中的字段。用户通过系统调用让操作系统向目标进程发送信号。
为什么要有信号?
Linux 需要信号是为了提供一种异步且轻量级的进程间通信与事件通知机制。使操作系统能够立即打断进程的正常执行流,以通知其发生了诸如用户中断、硬件异常、定时器到期或子进程退出等突发状况。信号机制弥补了管道或共享内存等同步通信方式的不足。
如何自定义捕捉信号?
使用 signal 函数对指定信号进行自定义处理设定。例如挑选 2 号信号 SIGINT(Ctrl+C),可以设置回调函数来拦截终止行为。
SIG_DFL:恢复默认行为。SIG_IGN:忽略信号。- 自定义函数:实现特定逻辑。
注意:9 号信号(SIGKILL)不能被自定义捕捉或忽略;6 号信号(SIGABRT)通常用于异常终止,即使设置了捕捉最终也会终止进程。
信号的产生
信号产生的方式
- 使用系统命令产生:如
kill命令。 - 通过键盘产生信号:如
Ctrl+C发送 SIGINT,Ctrl+Z发送 SIGTSTP。 - 系统调用产生:如
kill,raise,abort。 - 异常产生:如除零错误触发 SIGFPE,非法内存访问触发 SIGSEGV。
- 软件条件产生:如管道写端关闭导致读端报错,或闹钟到期。
三个系统调用层层递进
kill:发送给其他进程。raise:自己给自己发信号。abort:异常终止进程(发送 SIGABRT)。
键盘怎么向目标进程发送信号?
- 键盘输入:基于硬件中断工作。驱动处理按键,触发中断告诉 CPU 数据到来。
- OS 解释快捷键:组合键被解释为信号,通过系统调用
kill(pid, signum)发送。 - 确定目标进程:涉及进程组和会话管理。


