信号发送:Linux中发送信号的四种方式(系统调用、定时器)

产生进程信号有四种方式,其中一部分已经在“了解Linux中的信号”、“信号崩溃的原因”提到了,下面是做一个总结

— 键盘发送                           — 软件条件发送             

— 系统调用发送                   — 进程异常,OS发送

但是我们需要知道一件事:OS不会相信任何人,自己动手操作最放心,所以发送信号的本质是OS来发送


目录

一、键盘发送

二、进程异常发送

三、系统调用函数发送

1、kill函数:给任意进程发送信号

2、raise函数:给当前进程发送信号

3、abort: 使当前进程收到信号而异常终止(异常中止当前进程)

四、软条件发送

1、因操作导致条件不满足

2、系统层面设置定时器


一、键盘发送

Ctrl + C发送2号信号,默认处理方式是中止进程;Ctrl + \ 发送3号信号,默认处理方式是中止进程并core dump。验证过程详见下面的博客

进程信号 —— 信号处理函数signal(了解Linux中已有的信号)_abs(ln(1+NaN))的博客-CSDN博客初步了解进程信号的特点、信号处理函数signal 以及 Linux已有的信号https://blog.csdn.net/challenglistic/article/details/124413135?spm=1001.2014.3001.5501

二、进程异常发送

CPU运算过程中如果发现 诸如1/0、野指针取值的情况,这些都属于异常情况,这些异常情况会记录在状态寄存器 ——》OS会找到异常的源头进程,然后给进程发送信号 ——》这个信号不光只是中止进程的信号,还包含了异常信息(即我们平时看到的错误信息)

进程崩溃的根本原因(结合底层分析)_abs(ln(1+NaN))的博客-CSDN博客了解进程崩溃的原因,并通过core dump生成的文件知道哪一行崩溃了https://blog.csdn.net/challenglistic/article/details/124480829?spm=1001.2014.3001.5501

三、系统调用函数发送

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信号

函数返回值:距离发送信号还剩下多少秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值