Linux系统编程 | 信号入门

信号的概念

在我们的生活中,信号随处可见。比如,田径比赛中的发令枪,就是给运动员发出起跑的信号;交通路口的红绿灯,就是给我们发出允许通过或禁止通过的信号。这些信号都有共同的特点:

  1. 简单;

  2. 携带少量信息;

  3. 满足特定条件才发送。

信号是信息的载体,在Unix/Linux环境下,是一种古老、经典的通信方式,对于现代Unix/Linux来说,依然是非常重要的IPC(进程间通信)方式。

Unix系统早期版本就已经提供信号机制,但这些系统(如V7)所提供的信号机制并不完善,比较不可靠,信号可能出现丢失的现象。4.3BSD和SVR3均对信号模型进行了更改,增加了可靠信号机制。但不幸的是,二者并不兼容。POSIX.1对可靠信号机制进行了标准化,从而信号机制在Unix/Linux得到了大力的发展。

信号的机制

信号的本质是一种软件中断。它与硬件中断类似,提供了一种处理异步事件的方式,但是是在软件层面上所实现的中断。比如:

进程A向进程B发送信号,在收到信号之前,进程B正执行自己的代码。但收到进程A的信号之后,不管进程B代码执行到什么地方,都应暂停运行,转而去处理信号服务函数,处理完毕之后再继续执行自己的代码。

由于信号是软件层面上的中断,其实现方式使得信号具有一定的延时性,但这个延时时间非常短,对于用户来说,基本无法察觉,可以认为具有实时性。

每个进程所收到的所有信号,都是由内核负责发送,并且由内核处理。

信号状态

1. 递达状态

信号递送并且送达到目标进程。

2. 未决状态

处于信号产生与信号递达之间的状态。主要是由于阻塞/屏蔽而产生此状态。

3. 信号处理方式

a. 执行默认动作

b. 忽略

c. 捕捉(调用信号服务函数)

4. 阻塞信号集(信号屏蔽字)

该集合用于设置信号屏蔽,当将某个信号加入该集合中时,即可屏蔽该信号。后续收到该信号时,该信号的处理将延后,直到该信号的屏蔽被解除为止。

5. 未决信号集

信号从发出到递达的中间过程,叫作未决状态。内核里有个数组专门用来记录信号的未决状态,叫作未决信号集。当信号处理未决状态时,对应位被置1,否则置0。

解除未决状态的方式有两种:

a. 此信号被解除阻塞

b. 此信号被忽略

信号的编号

想要查看当前系统支持的所有信号可用kill -l命令。

img

img

乍一看,信号有64个,其实只有62个,因为没有32,33号信号,同时也不存在0号信号。31号以下的信号称为常规信号,或普通信号,34号以上的信号称为实时信号

信号四要素

\1. 信号编号;

\2. 信号名称;

\3. 默认处理动作;

\4. 对应的事件。

信号的默认动作有以下几种:

term:终止进程

ign: 忽略信号 (默认即时对该种信号忽略操作)

core:终止进程,生成Core文件。(查验进程死亡原因, 用于gdb调试)

stop:停止(暂停)进程

cont:继续运行进程

这里要特别注意两个信号:

9) SIGKILL 和 19) SIGSTOP信号,它们是不允许被忽略或被捕捉,只能执行默认动作,同时也不能将其设置为阻塞。这是因为,这两个信号是用来终止进程的,如果它们能够被忽略/捕捉/阻塞,那进程将处于不可控状态,内核将无法对进程进行处理。

 

---------------

码字不易,点个赞再走呗~

我是良许,世界500强外企 Linux 开发工程师,专业生产 Linux 干货。欢迎关注我的公众号「良许Linux」,回复「1024」获取最新最全的技术资料,回复「入群」进入高手如云技术交流群;提供永久免费 CSDN 资料下载服务。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

良许Linux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值