进程信号
1 信号是什么
信号是一个软件中断,是传递给进程的一个通知,通知进程发生了某件事情,让它把手头的事情先放下,赶紧去处理刚刚通知的这件事情.
2 信号的种类
信号总共有62种—这62种信号又分为两大类型.
一种叫做不可靠信号(信号编号为1—31).
一种叫做可靠信号(信号编号为34—64).
查看信号的命令 kill -l
3 信号的生命周期
1信号的产生–>2在进程中的注册–>3注销信号–>4处理信号
1信号的产生:
信号的产生方式分为两种,一种叫做硬件产生,另一种叫做软件产生
硬件产生: 我们通过键盘输入的方式从终端发出信号:例如: ctrl +c(产生 SIGINT信号) ctrl +| ctrl +z( Ctrl-Z产生SIGTSTP信号(可使前台进程停止))
软件产生:用户通过自定义函数或者调用系统函数来缠上 例如: kill -signum -p pid kill(pid,signum) raise(signum) abort()
alarm(nsec)
2 信号在进程中的注册
注册: 信号产生以后,会传递给进程,在进程pcb中做标记,标记进程收到了那些信号
pcb中有一个用来注册信号的的结构体叫未决(pending),它用数字0 和 1来标记信号的注册情况
1 :表示已经注册 0 : 表示未注册
pcb中有一个用来存储待处理信号的链表叫做sigqueue ,每注册成功一个信号,sigqueue链表就会多一个节点.
未决(pending): 是一种状态—信号从产生到处理之前所处的状态
根据信号类型的不同,信号的注册又分为可靠信号的注册和不可靠信号的注册
2.1 不可靠信号的注册
首先当一个不可靠信号传递到进程需要进行做注册时,先会判断pcb中的pending位图相应的信号是否已经注册过(位图是否已经置为1),
若已经注册(位图标记显示为1),则,不做任何操作(后续的信号丢失,事件丢失,耽误事,不靠谱).若未注册,就将位图中的标记数改为1, 并向
sigqueue链表中添加一个信号节点.
2.2 可靠信号的注册
当一个可靠信号传递到进程需要进行注册时,不管信号是否已经注册,都会向sigqueue链表添加一个新的信号节点(事件不会丢失)
3 信号在进程中的注销
非可靠信号: 节点只有一个,注销就是删除节点,删除节点后将位图置为0状态
可靠信号: 节点可能有多个,注销就是删除一个节点,判断sigqueue链表中是否有相同信号的节点.
如果有,位图显示不变,依然需要标记这个信号待处理,如果没有,就将位图显示置为0.
4 信号的处理
进程收到信号以后,并不是立马去处理,而是选择一个合适的时间去处理信号.
当进程从内核态返回到用户态的时候,才会处理
进程如何从用户态切换到内核态: 中断/发起系统调用/程序异常/
进程运行的代码如果是用户自己写的代码或者是库函数就说明进程运行在用户态空间中
信号的处理方式:
1 默认处理方式-----按照既定的方式处理(按既定方案办);
2 忽略处理方式-----处理动作是什么都不干;
3自定义处理方式—用户自己确定信号如何处理—自定义信号的处理函数替换原有的处理函数
4如何修改信号的处理方式?
sighandler_t signal(int signum,sighandler_t handler);
// signum: 信号编号---替换signum这个信号的处理函数
// handler: 函数指针 用户传入的处理函数
SIG_DFL:信号的默认处理动作
SIG_IGN:信号的忽略处理动作
typedef void(*sighandler_t)(int);
5 自定义处理方式信号的捕捉流程
如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号
6 信号的阻塞
信号的阻塞发生在信号注册以后,信号的阻塞指的是信号可以注册,但是暂时对其不做任何处理,简单来说一个信号若是被阻塞,它就不会递达信号的处理阶段.
靓词: 递达 —对信号的处理
特别注意:信号阻塞和信号忽略处理方式不同,信号阻塞是指信号还没有进入到处理阶段,而信号的忽略处理方式是指信号已经进入到信号处理阶段,并且对它做了"忽略处理".
在PCB中有一个信号集叫做block-----阻塞信号的集合----标记那些暂时不用处理的信号.