信号(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函数
-
使用步骤
-
示例代码
学习地址
信号捕捉
signal函数
注意注册二字,不是应用程序去捕捉,是内核去捕捉;
signo代表捕捉的信号;
示例代码:
sigaction函数
重点函数
成员1 、3、4重点学习
1 捕捉后执行动作
3 sa_mask作用域生命周期为执行动作期间(原因有可能信号再次发出)
4 一般为0
代码示例
- 信号捕捉特性
位图只能记录2种状态,不能记录次数,故不支持排队;
若执行捕获执行函数时,不想被其它信号打扰,屏蔽即可,如下代码
内核实现信号捕捉过程
SIGCHLD信号
SIGCHLD产生条件
借助SIGCHLD回收子进程
这样写有个问题,多个子进程同时结束时,因位图只有0和1,故有些子进程就没回收;
正确代码如下
循环回收即可
如果注册信号还没完,子进程结束了,怎么解决?
慢速系统调用:
慢速系统调用被信号中断,处理完信号后,应返回阻塞出;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2022-01-25 管理器中修改串口号