标签:返回 检测 signal 不可 alt 思考 sig ima 通过
1.内核为每个进程给了两个位图,一个为mask(默认为1),一个为pending(默认为0)
2.当内核态转到用户态时,检测是否有信号,用mask & pending得到结果,如果没有接到信号,那么结果为32位的0,此时通过内核中保存的地址返回原进程。
3.当有一个信号来时,pending中对应位置变为1,当一个中断到来时,在内核中保存原进程的地址等待调度,当调度到时,从内核态转为用户态,此时由于pengding & mask的值不全为0,所以也就发现了信号,也就能够执行signal了。
4.此时替换内核中地址,将要执行的signal参数中的函数地址装进,设置mask和pengding的对应位为0
5.执行完signal中的函数后,将内核中的地址换为之前函数的地址,设置mask为1.最后通过将内核态转为用户态执行之前的进程。
思考:1.如何忽略一个信号?
在signal中有一个参数设置为忽略模式后,在信号对应的位置的mask设置为0,即可永久屏蔽信号
2.信号从收到到相应有一个不可忽略的时延
响应是在内核转用户时候发生的,所以需要有中断进入内核的情况才可以
3.标准信号为什么要丢失
因为如果一次性发送1W个信号的话,位图的同一个位置只有一个1存在,也就是只能在中断后,在内核转向用户态的时候响应一次
标签:返回 检测 signal 不可 alt 思考 sig ima 通过
原文地址:https://www.cnblogs.com/hxl-learning-space/p/14687363.html