linux信号基本概念及如何产生信号


阅前须知


本文的主要内容有:

1.信号的基本概念(包括进程对信号的3种处理方式)

2.特殊信号举例:写代码证明信号存在,并实现信号的简单捕捉

3.如何产生一个信号(代码举例:mykill的实现)

其中拓展知识有:

1.前台进程与后台进程(代码举例)

2.核心转储core dumped的概念及其在代码调试中的作用(代码举例)

——>全篇阅读大概需要5分钟<——


信号的基本概念


首先,我们可以用kill -l命令查看系统中定义的信号列表:

1

乍一看,好像有64种信号,但如果仔细观察,你就会发现并非如此。没有32和33号信号。一共只有62个信号。。。

说实话,你是不是和博主刚开始一样被骗了>.<

我们可以看到,每个信号都有一个编号和一个宏定义名称,这些宏定义可以在头文件signal.h中找到。

其中编号34以上的是实时信号,34以下的信号是普通信号。而这些信号各自在什么条件下产生,默认的处理动作是什么,在signal(7)中都有详细说明,在命令行上输入man 7 signal:

2

知道了什么是信号,那么为什么有信号,信号是谁发送给谁的呢,怎么发送?

答案很简单,想想我们在日常生活中也有很多信号,比如常见的红绿灯信号。所以linux中的信号也是类似的。它无非是想提供一个机制在需要的时候告诉某个进程该怎样做。是一种规定,便于系统操作。就像我们都知道”红灯停,绿灯行“一样。

信号的发送者有很多,比如终端驱动程序,进程,系统。而接收者大多是一个进程。

那么怎么做就是给某进程发送一个信号呢?事实上,给进程发一个信号就是修改目标进程pcb结构体中的关于信号的字段(让进程记录此信号),想一想,用什么数据结构可以解决这个问题呢?

答案也很简单,进程是否接收到信号本身是一个原子问题。它要么收到,要么没收到。所以可以用位图来表示进程是否收到信号,只需要修改一个比特位(操作系统完成):收到信号就置1。如果有小伙伴不了解位图的概念,可以戳这里:STL容器BitSet(位图)——1道腾讯笔试题的正确打开方式

进程收到信号后,其可选的处理动作有以下三种:

  1. 忽略此信号。

  2. 执⾏行该信号的默认处理动作(终止该信号)。

  3. 提供⼀个信号处理函数(自定义动作),要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(Catch)一个信号。


Code(特殊信号举例)


知道了信号的基本概念,接下来我们通过代码来感受信号的真实存在性。

以 2号信号SIGINT:Ctrl + C为例。

代码:写一个死循环程序,并用进程命令查看。观察输入Ctrl + C前后系统中的进程变化

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值