信号(4要素、kill、alarm、信号集操作函数、信号捕捉)

信号的概念

简单
不能携带大量信息
满足某个特定条件才发送

学习地址

与硬件中断类似
A给B发送信号,B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。
与硬件中断类似--异步模式。但是信号是软件层面上实现的中断,早期常被称为“软中断”

image
内核发送信号、内核处理
image


信号的产生

产生信号:

image

image

image

学习地址

下图是处理机制
image
一旦被屏蔽的信号,在解除屏蔽前,一直处于未决态,即还未被处理;
未决信号是信号已产生,尚未被处理;未决信号里的信号大多是被屏蔽的信号;

常见信号
kill -l
1-31
32-64
image

  • 信号四要素
    信号编号、信号名称、信号对应事件、信号默认处理动作
    注意信号在使用之前应确认4要素,再使用

man 7 signal

  • 常规信号一览表

image

image

image

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

image
有发信号需求,使用SIGUSR1 SIGUSR2

image

image

  • kill函数和命令

image
kill函数是发送信号,不是杀死信号;
使用宏定义名字

kill -9 -进程组id(对应着kill函数,参数pid为0)

示例
image

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

学习地址

image
讲fork时提到过闹钟,父子进程有不同时,就有闹钟;

示例代码
image

image

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

setitimer函数

学习地址

image

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

image

示例
image
2s后第一次输出
之后,5s后第二次输出
之后,5s后第三次输出
......


信号集操作函数

可以操作的是:屏蔽信号集
对应位为1,代表屏蔽

image
右下角set为自定义信号集

  • 信号集设定

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

  • sigprocmask函数

image

image

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

  • sigpending函数

image

image


信号捕捉

signal函数

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

示例代码:
image

sigaction函数
重点函数

image

image

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

代码示例

image

  • 信号捕捉特性

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

image

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

内核实现信号捕捉过程

image


SIGCHLD信号

学习地址

SIGCHLD产生条件

image

借助SIGCHLD回收子进程

image

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

如果注册信号还没完,子进程结束了,怎么解决?
image

慢速系统调用:
image

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


posted @   我爱茜茜公主  阅读(184)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2022-01-25 管理器中修改串口号
点击右上角即可分享
微信分享提示