linux信号学习

信号

一信号

信号是什么:
是一个软件中断,通知进程发生了某个时间,中断当前进程当前正在执行的操作,去处理这个事件。(事件就代表这事件)
信号有多种,各自表示着不同的事件
信号的生命周期:
(信号的产生,在进程中注册,限号的销毁,信号的处理)(信号的阻塞( 暂时不处理))
信号的种类:
查看信号种类 kill -l (62种)
(kill 本质是发送信号终止进程 int kill(pid_t pid , int sig )pid任意进程,sig任意进程)
(raise 发送一个信号给调用进程 int rasie(int sig) 等价与 int kill 给进程自身一个信号 )
(abort 引发不正常进程的终止 void abort (void) 当进程捕捉到异常时给自己发送信号,让当前进程以一种非正常终止的形式退出进程)
(unsigned int alarm ( unsigned int seconds) 定时器 等到seconds秒后给进程发送一个SIGALRM信号表示时间到)
第一类1-31非可靠信号 有可能造成事件丢失
第二类 34-64 可靠信号 不会造成事件丢失
信号的产生:
硬件的产生:ctrl+c中断当前的程序(产生一个硬件信号发送给cpu产生了一个软件信号发送给进程)
软件的产生:kill -9(signum信号值) kill() abort() alarm()
ulimit-a 查看进程中的一些限制信息
ulimit-c 设置core dump 文件的最大大小

信号在进程中注册:
操作系统修改进程pcb中的一个信号标志位
pending 未决信号集合(未决:从产生到处理之间信号所处的一种状态 )
信号在内核中的表示
信号在内核中的表示
每个信号都有两个标志位,分别表示阻塞(block)和未决(pending),还有一个函数指针表示处理动作。信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号传递才清除未决标志。
在这里插入图片描述
结构体中的sigqueue 链表保存信号,每产生一个信号,向链表中添加一个节点,修改pending位图,当需要处理信号时再查看位图标记信号pending是否为1,位图的大小为1024bits.
信号的注册;
在未决信号集合中修改信号对应位图,并向sigqueue链表中添加信号节点。
非可靠信号:若当前未决信号集合中指定位置已经注册,则什么都不做。
可靠信号:不管当前信号是否已经注册,都会去修改位图,添加一个新的sigqueue节点。
信号在进程中注销
原理:修改未决信号集合
注销:删除当前信号的一个sigqueue节点,并修改位图
非可靠信号:删除节点后,直接将位图置0;
可靠信号:删除节点后,判断是否还有相同信号节点,若没有,将位图置0;
信号的处理
1.默认处理方式 :系统自己定义
2.忽略:信号不注册
3自定义:保存信号的sigqueue中的每个节点,每个节点都指向一个函数指针数组,对应的信号调用下标函数,因此可以自定义修改handler函数数组对应下标的回调函数地址,就可以修改信号的处理方式。
在这里插入图片描述

自定义处理方式的信号捕捉流程
1.程序在主控流程中通过中断/异常/系统调用而进入内核态运行。
2.当处理完功能后,从内核态运行返回用户态之前,去处理信号
3.因为自定义信号处理是程序员自己定义的,所以此时的运行的用户态需要切换到用户态运行回调函数。
4.返回内核态,继续处理信号,若没有信号,则返回用户态主控流程。
在这里插入图片描述

信号的阻塞
阻止一个信号被递达(信号依然可以注册,只是暂时不被处理)
信号的未决:是一种描述信号从注册成功到处理之前的状态。
信号的递达:指的信号的处理动作
信号的阻塞:暂时组织信号被递达,task_struct结构体中sigset_t blocked位图会标记哪个信号被阻塞。
阻塞一个信号:只需要在pcb中将这个信号在阻塞记恨中标记就可以。
注:在所有信号中,有两个信号(9-SIGKILL/19-SIGSTOP )无法被阻塞,无法被定义,无法被忽略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值