产生进程信号有四种方式,其中一部分已经在“了解Linux中的信号”、“信号崩溃的原因”提到了,下面是做一个总结
— 键盘发送 — 软件条件发送
— 系统调用发送 — 进程异常,OS发送
但是我们需要知道一件事:OS不会相信任何人,自己动手操作最放心,所以发送信号的本质是OS来发送
目录
3、abort: 使当前进程收到信号而异常终止(异常中止当前进程)
一、键盘发送
Ctrl + C发送2号信号,默认处理方式是中止进程;Ctrl + \ 发送3号信号,默认处理方式是中止进程并core dump。验证过程详见下面的博客
二、进程异常发送
CPU运算过程中如果发现 诸如1/0、野指针取值的情况,这些都属于异常情况,这些异常情况会记录在状态寄存器 ——》OS会找到异常的源头进程,然后给进程发送信号 ——》这个信号不光只是中止进程的信号,还包含了异常信息(即我们平时看到的错误信息)
三、系统调用函数发送
Linux给我们提供了发送信号的系统调用函数,下面就逐一来了解这些函数
1、kill函数:给任意进程发送信号
下面是kill函数的声明以及需要用到的头文件
(1) 参数、返回值解析
第一个参数是目标进程的pid,也就是要给哪个进程发送信号
第二个参数是信号ID,也就是要给目标进程发送几号信号
返回值:成功时返回0,调用失败返回-1
(2) 函数调用
这里就不创建其他进程,直接就给当前进程发送2号信号。
2、raise函数:给当前进程发送信号
(1) 参数、返回值解析
参数表示要给当前进程发送几号信号
返回值:成功时返回0,调用失败返回-1
(2) 函数调用
下面演示给当前进程发送3号信号
3、abort: 使当前进程收到信号而异常终止(异常中止当前进程)
下面是abort函数的声明及其需要的头文件,abort函数实际上是给当前进程发送6号信号
四、软条件发送
系统层面设置定时器 或者 某种操作导致条件不满足的时候,OS会给对应的进程发送信号
1、因操作导致条件不满足
最典型的就是前面命名管道那一部分,读端不读了,而且还退出进程了,这个时候写端还在傻乎乎的往管道里写,这不是明摆着浪费资源么。由于不满足 “读端和写端都连接到管道” 这个条件,这个时候OS就会给写端发送13号信号SIGPIPE!
2、系统层面设置定时器
Linux提供了一个到点发送14号信号的函数 alarm函数,14号信号的作用是中止当前进程
函数参数:设置 多少秒以后给当前进程发送一个alarm信号
函数返回值:距离发送信号还剩下多少秒