进程信号

信号:
信号就是软件中断,打断当中正在运行的进程,让该进程去处理信号事件
信号种类
一共62种信号
不可靠信号:1-31
可靠信号:34-62
信号的产生:
硬件产生:
ctrl+c:给前台发送一个SIGINT,中断当前的前台进程
ctrl+z:SIGSTP使进程暂停
ctrl+|:SIGQUIT,是进程崩溃,并产生coredump文件
软件产生:
kill [pid] SIGTERM
kill -[signalno] [pid]
函数产生:
kill函数 kill(pid_t pid, int signo)
abort函数 谁调用谁退出 SIGBRA
alarm 定时器函数
信号注册分两种情况:
非可靠信号1-31:
更改sig位图对应的比特位为1,在sigqueue队列当中添加对应信号对应的节点
当多次收到同一个信号时,只添加一次节点,受到同样的信号被抛弃
可靠信号34-62:
更改sig位图对应的比特位为1,在sigqueue队列当中添加对应信号对应的节点
当多次收到同一个信号时,判断sig位图是否为1,并在sigqueue队列当中添加节点

信号的注销分两种情况:
非可靠信号1-31:
更改sig位图对应的比特位为0,在sigqueue队列当中删除对应信号对应的节点
可靠信号34-62:
将带注销的信号在sigqueue队列当中盘算,当前信号节点在队列中是否还有同样的类型
有:不改变位图,删除一个节点
没有:将位图改比特位置为0

在这里插入图片描述
信号的捕捉处理:
默认处理:执行一个动作、函数
忽略处理:不做什么,僵尸进程原因SIGCHILD信号
自定义处理:sighandler_t signal (int signum, sighandler_t handler)

操作系统对信号的默认处理:
当sig位图收到一个信号时,意味着sig位图被置为1了,操作系统处理信号的时候就会从PCB当中找到sighang_struct结构体指针,从而找到sa_handler,进而操作系统回去调用sa_handler保存的函数地址
signal相当于改变了sa_handler保存的函数地址,当收到自定义信号时,操作系统内核会去调用sa_handler保存的函数地址,也就达到了更改函数处理的目的

我们注册的函数,被称为回调函数,不是我们来调用,而是当我们收到自定义信号操作系统会来执行。
在这里插入图片描述
sigaction相当于改变了action数组元素,改变了整个结构体来达到修改处理函数地址的目的
signal调用sigaction函数实现

信号捕捉流程
在这里插入图片描述
进入内核态条件:
1.使用系统调用
2.使用库函数,库函数底层调用系统调用
3.程序异常
3.1空指针访问
3.2内存问越界

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值