目录
1.信号产生
概念:
core vs Term
信号产生的5种条件
从软硬件理解信号的保存
软件,如何理解信号处理?
硬件中断
2、信号捕捉
3、信号阻塞
信号其他相关常见概念
1.信号产生
概念:
什么是信号?信号一种用户、OS、其他进程,向目标进程发送导步事件的一种方式!
概念问题:
- 你怎么能识别信号呢?识别信号,是内置的。进程认识信号,是程序员内置的特性,也就是说默认的信好捕捉是提前写好的
- 信号产生之后,怎么处理你知道吗?知道。如果没有产生,你知道信号怎么处理吗?知道!信号的处理方法,在信号产生之前,已经准备好了。
- 处理信号?立即处理吗?我在做我的事情,优先级很高,信号处理,可能并不是立即处理。合适的时候?? 3.1 到来 <- 没有处理,进程记录下来对应的信号!,等到空闲 -> 处理
- 怎么处理信号呀?a. 默认行为 b. 忽略信号 c. 自定义动作
信号查询:在命令行中输入
man 7 signal
就可以得到1-31个标准信号
core vs Term
正常的退出,不需要进行debug
核心转储
在当前目录下形成文件,pid.core
进程崩溃的时候,将进程在内存中的部分信息保存起来,方便后续调试!
云服务器一般是关闭core功能的!
ctrl + c 2号信号
ctrl + \ 3号信号 默认是终止的
信号的默认处理方式是内置的,要修改也是可以的
捕捉信号的函数 : signal 信号捕捉和自定义
void (*signal(int sig, void (*func)(int)))(int);
第二个参数 SIG_IGN忽略信号 ignore:忽略:本身就是一种信号捕捉的方法,动作是忽略
SIG_DFL default:默认。
这俩本质上是宏
也可以传函数 void (*func)(int)))(int)是个函数指针
第一个参数是第几个信号
例如:
signal(SIGINT, SIG_DFL);
signal 只需要使用异常 如果没有产生信号的话,自己写的方法不会被调用
信号产生的5种条件
1.键盘
2.指今
3.系统调用
4.软件条件
5.异常
从软硬件理解信号的保存
软件,如何理解信号处理?
键盘产生 -> OS发送 ->进程 如何记录下来信号?
1-31个信号,熟不熟悉?
对的,位图
操作系统的PCB存在这样的结构:task struct -> uint32 t signalbits
0000 0000 0000 0000 0000 0000 0000 0000
比特位的位置:信号的编号
比特位的内容:是否为0/1,是否收到对应的信号
发送信号的本质是什么?写入信号!
OS修改目标进程的PCB中的信号位图,0->1
无论以什么方式发送信号,最终,都是转换到OS,让OS写入信号的。
因为task struct的唯一管理者是OS!!
系统调用发送信号 kill raise(给自己发信号) abort(给自己发6号信号)
键盘输入都是先发送硬件中断到cup,所以以后操作系统就不需要轮询等键盘了,而是cpu告诉OS什么时候有外设准备好了,内容由操作系统读取。
硬件,操作系统怎么知道键盘上的数据了?
硬件中断
2、信号捕捉
用户态与内核态
pending表和block表的检测在3~4之间,这样就可以在处理,自定义信号的时候再次接受新来的信号,也只能同时接受俩信号
3、信号阻塞
信号其他相关常见概念
- 实际执行信号的处理动作称为信号递送(Delivery)。
- 信号从产生到递送之间的状态,称为信号未决(Pending)。
- 进程可以选择阻塞(Block)某个信号。
- 阻塞特定信号,信号产生了,一定把信号要进行pending(保存),永远不递送,除非我们解除阻塞。
- 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递送的动作。
- 注意,阻塞和忽略是不同的,只要信号被阻塞就不会递送,而忽略是在递送之后可选的一种处理动作。
操作系统的PBC有3个表,我们可以用以下函数操控blocks表