信号(4要素、kill、alarm、信号集操作函数、信号捕捉)
信号的概念
简单
不能携带大量信息
满足某个特定条件才发送
与硬件中断类似
A给B发送信号,B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。
与硬件中断类似--异步模式。但是信号是软件层面上实现的中断,早期常被称为“软中断”

内核发送信号、内核处理

信号的产生
产生信号:



下图是处理机制

一旦被屏蔽的信号,在解除屏蔽前,一直处于未决态,即还未被处理;
未决信号是信号已产生,尚未被处理;未决信号里的信号大多是被屏蔽的信号;
常见信号
kill -l
1-31
32-64

- 信号四要素
信号编号、信号名称、信号对应事件、信号默认处理动作
注意信号在使用之前应确认4要素,再使用
man 7 signal
- 常规信号一览表



前20个,重点学习如下
SIGKILL、SIGSTOP
SIGUSR1、SIGUSR2 没事事件
SIGCHLD
SIGCONT、SIGSTOP

有发信号需求,使用SIGUSR1 SIGUSR2


- kill函数和命令

kill函数是发送信号,不是杀死信号;
使用宏定义名字
kill -9 -进程组id(对应着kill函数,参数pid为0)
示例

- 软件条件产生信号:
alarm函数
定时发送信号SIGALRM给当前进程

讲fork时提到过闹钟,父子进程有不同时,就有闹钟;
示例代码


实际时间 = 用户时间+系统时间+等待时间;
setitimer函数

new value 定时时间
old value 传出参数,即剩余时间

示例

2s后第一次输出
之后,5s后第二次输出
之后,5s后第三次输出
......
信号集操作函数
可以操作的是:屏蔽信号集
对应位为1,代表屏蔽

右下角set为自定义信号集
- 信号集设定

信号集有了,怎么和进程中pcb里面的屏蔽信号集产生联系呢,可以使用如下函数;
- sigprocmask函数


注意屏蔽信号和忽略的区别;
单词block有阻塞意思;
不推荐使用how参数的SIGG_SETMASK;
- sigpending函数

-
使用步骤
![image]()
-
示例代码
学习地址
![image]()

信号捕捉
signal函数

注意注册二字,不是应用程序去捕捉,是内核去捕捉;
signo代表捕捉的信号;
示例代码:

sigaction函数
重点函数


成员1 、3、4重点学习
1 捕捉后执行动作
3 sa_mask作用域生命周期为执行动作期间(原因有可能信号再次发出)
4 一般为0
代码示例

- 信号捕捉特性

位图只能记录2种状态,不能记录次数,故不支持排队;

若执行捕获执行函数时,不想被其它信号打扰,屏蔽即可,如下代码

内核实现信号捕捉过程

SIGCHLD信号
SIGCHLD产生条件

借助SIGCHLD回收子进程

这样写有个问题,多个子进程同时结束时,因位图只有0和1,故有些子进程就没回收;
正确代码如下

循环回收即可
如果注册信号还没完,子进程结束了,怎么解决?

慢速系统调用:

慢速系统调用被信号中断,处理完信号后,应返回阻塞出;



浙公网安备 33010602011771号