网站代理合作,网站维护公告模板,学做内账的网站,公司形象墙设计效果图大全#x1f493;博主CSDN主页:杭电码农-NEO#x1f493; ⏩专栏分类:Linux从入门到精通⏪ #x1f69a;代码仓库:NEO的学习日记#x1f69a; #x1f339;关注我#x1faf5;带你学更多操作系统知识 #x1f51d;#x1f51d; 进程信号 1. 前言2. 信号的基… 博主CSDN主页:杭电码农-NEO ⏩专栏分类:Linux从入门到精通⏪ 代码仓库:NEO的学习日记 关注我带你学更多操作系统知识 进程信号 1. 前言2. 信号的基本概念3. 信号产生的方式概述4. 核心转储讲解5. 如何理解信号发送的本质?6. 总结 1. 前言
在实际生活中有很多信号的例子,比如红灯停,绿灯行.我们是怎样知道这些信号的呢?首先要识别这个信号,并且要知道如何处理这个信号,在Linux系统中的信号也是如此,至少要做到两点: 识别信号,处理信号
本章重点: 本篇文章着重讲解Linux下信号的基本 概念以及产生信号的四种方式,本篇文章 会带领大家入门信号这一篇章 2. 信号的基本概念
先给结论,什么是Linux信号? 本质是一种通知机制,用户或操作系统通过发送一定的信号,通知进程,某些事件已经发生,你可以在后续对它进行处理 使用kill -l命令查看信号列表 CTRLc就是向进程发送2号信号
结合进程和信号,我们得出下面的结论: 进程要处理信号,必须具备识别信号的能力(看见信号处理信号)凭什么进程能够识别信号?是事先程序员就内置了一套代码用于识别处理信号信号的产生是随机的,收到信号时,此进程可能正在忙于其他事情,所以收到信号可能并不是立刻就处理,可能是后续处理既然信号不是立刻就处理的,那么一定存在某种结构来短暂保持收到的信号 对于信号的理解可以分为: 信号的产生,保存以及处理 而本篇文章讲解的则是信号的产生, 信号的产生一共有四种方式:
终端按键产生信号使用系统调用产生信号由软件条件产生信号由硬件条件产生信号 3. 信号产生的方式概述
方式一: 终端按键 我们可以使用CTRLc或CTRL_/的 方式产生信号,并且CTRLc产生的是 2号信号,也就是SIGINT信号,然而 CTRL/产生3号信号,也就是SIGQUIT 1~31号信号是普通信号,也是要重点学习的, 34~64号信号是实时信号,不多谈 使用man 7 singal查看信号描述 Term代表终止这个进程,这也就是为什么 CTRLc可以终止进程的原理,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. 总结
本篇文章只是打响了认识信号的 第一枪,关于信号的细节还有很多, 包括进程是如何保存信号的细节,以及 进程是如何捕捉到信号的,这些都会 在后面的文章中一一讲解 下期预告:信号的保存以及处理