1. 前言
在实际生活中有很多信号的例子,比如红灯停,绿灯行.我们是怎样知道这些信号的呢?首先要识别这个信号,并且要知道如何处理这个信号,在Linux系统中的信号也是如此,至少要做到两点: 识别信号,处理信号
本章重点:
本篇文章着重讲解Linux下信号的基本
概念以及产生信号的四种方式,本篇文章
会带领大家入门信号这一篇章
2. 信号的基本概念
先给结论,什么是Linux信号?
本质是一种通知机制,用户或操作系统通过发送一定的信号,通知进程,某些事件已经发生,你可以在后续对它进行处理
使用kill -l命令查看信号列表
CTRL+c就是向进程发送2号信号
结合进程和信号,我们得出下面的结论:
- 进程要处理信号,必须具备识别信号的能力(看见信号+处理信号)
- 凭什么进程能够识别信号?是事先程序员就内置了一套代码用于识别+处理信号
- 信号的产生是随机的,收到信号时,此进程可能正在忙于其他事情,所以收到信号可能并不是立刻就处理,可能是后续处理
- 既然信号不是立刻就处理的,那么一定存在某种结构来短暂保持收到的信号
对于信号的理解可以分为: 信号的产生,保存以及处理
而本篇文章讲解的则是信号的产生,
信号的产生一共有四种方式:
- 终端按键产生信号
- 使用系统调用产生信号
- 由软件条件产生信号
- 由硬件条件产生信号
3. 信号产生的方式概述
方式一: 终端按键
我们可以使用CTRL+c或CTRL_/的
方式产生信号,并且CTRL+c产生的是
2号信号,也就是SIGINT信号,然而
CTRL+/产生3号信号,也就是SIGQUIT
1~31号信号是普通信号,也是要重点学习的,
34~64号信号是实时信号,不多谈
使用man 7 singal查看信号描述
Term代表终止这个进程,这也就是为什么
CTRL+c可以终止进程的原理,core会在
后面进行讲解
方式二: 系统调用
在函数中调用kill,raise,abort等函数也能产生信号
kill是向指定进程发送指定的信号
raise是向自己发送指定的信号
abort是终止当前进程(发送6号信号)
方式三: 软件条件
请大家注意第13号信号,SIGPIPE,当我们在学习管道时会遇见这种情况,管道读端不光不读了,并且还把读端关闭了,而写端还在写,此时操作系统会自动终止写进程.怎样终止的呢?是OS向写端发送了SIGPIPE信号而终止了进程
方式四: 硬件异常
最典型的除0错误,指针系列错误以及段错误都是由于硬件异常而产生的信号,从而导致进程被终止
所有的信号都有它的来源,但最终全部都被操作系统识别,解释,并且发送给进程
4. 核心转储讲解
在查看信号的描述时,我们会注意到
某些信号的默认行为是core,也就是
核心转储
核心转储指的是,当进程出现某种异常时,是否由操作系统将当前进程在内存中的相关核心数据,转移到磁盘中,如果核心转储被设置,则会转移到磁盘,反之则不会,若信号的默认做法是core,则在终止进程的同时会发生核心转储,目录中会多出一共文件
当代码异常终止,并且发生核心转储后,使用gdb调试时只需输入: core file即可定位到出错的行
5. 如何理解信号发送的本质?
上面说到,信号被进程接收到后不会立马处理,
那么就要存在一个结构来保存信号,什么结构
最合适?我给出的答案是位图!
信号有1~31号信号,那么只需要31个
bit位即可保存完所有的信号,x号bit
位中的0/1代表是否收到第x号信号,
而这个位图结构是每个进程独有的,
所以它很明显在进程的PCB中保存
`信号发送的本质: 操作系统向目标进程发送信号,也就是操作系统直接修改PCB中指定的位图结构,修改完成后即为成功发送信号
6. 总结
本篇文章只是打响了认识信号的
第一枪,关于信号的细节还有很多,
包括进程是如何保存信号的细节,以及
进程是如何捕捉到信号的,这些都会
在后面的文章中一一讲解
🔎 下期预告:信号的保存以及处理 🔍