信号
信号是由内核产生并发送的,
信号可以用于进程和进程之间通信,也可以用于内核和进程间的通信。
虽然我们用的最多的是用信号杀死进程。但实际上我们我们可以捕捉信号做特定处理。
特点
- 简单
- 携带的信息量少
- 使用在某个特定的场景中
信号的状态
- 产生
- 键盘:ctrl +c
- 命令:kill
- 系统函数:kill
- 软条件:定时器
- 硬件:段错误,除0错误
- 未决状态-没有被处理
- 等待被处理
- 递达- 信号被处理了
- 忽略
- 捕捉(我们需要做的是捕捉信号并做用户自定义操作)
- 执行了默认动作
- SIGKILL和SIGSTOP是不能够被捕捉,不能够被阻塞和忽略的。
利用信号通信的问题
信号优先级比较高,进程收到信号之后,暂停正在处理的工作,优先处理信号,处理完成之后再继续暂停的工作。
会导致有些时候代码执行到一半,来了信号,中止去做处理,处理的过程中对数据的操作影响到一开始中止的代码逻辑,设计代码时非常麻烦。
如果使用信号做进程间通信,可能产生的问题和情境比较多,不建议使用信号做进程间通信。
阻塞信号集,未决信号集
是在pcb里,即内核里,我们不能直接操作的。
- 阻塞信号集:
- 要屏蔽的信号,即放到未决信号集中
- 未决信号集
- 没有被处理信号的集合
信号相关的函数
- kill :发送信号给指定进程
int kill(pid_t pid,int sig);
- shell 命令 kill -l 可以参考所有信号宏