Linux:信号的产生、记录以及处理动作

信号的产生、记录及处理动作

信号有哪些?

Linux下一共有62个信号,0-34为普通信号(无32、33信号),35-64为实时信号。
在这里插入图片描述

信号是怎么产生的?

信号是由操作系统直接或间接产生的。
信号的产生有四种情况:

1. 通过键盘产生

比如我们不下心写了一个死循环,那么我们要终止这个死循环就会按Ctrl+c,那么Ctrl+c的本质其实就是向目标进程或是前台进程发送2号信号,键盘产生了信号,但是其实是操作系统把这个信号发给进程的,操作系统获取到键盘上的信号,把它解析成2号信号,然后发给进程。进程收到2号信号之后默认就是当前进程退出。所以你就可以结束掉你写的这个死循环。

2. 通过命令或函数(系统调用)

①通过命令
比如还是这个死循环,我们想要结束它。那么我们可以打开另一个终端,通过ps aux | grep a.out这条命令来查看该进程的id号(假设进程叫做a.out,进程的ID号是6524),然后在命令行输入kill -2 6524,即可结束掉这个死循环进程。
在这里插入图片描述
②通过系统调用函数
比如还是这个死循环,我们想要结束它。那么我们可以通过系统调用函数kill,即可结束掉这个进程。
kill程序代码如下:
在这里插入图片描述
操作如下:
打开新的终端,查看死循环进程的进程ID,运行我们的kill程序,将该进程的进程ID以及要发送的信号以命令行参数进行传入kill系统调用函数,最后使用kill系统调用函数将该死循环进程终止。
在这里插入图片描述

3. 软件条件

操作系统识别到一个事件,没有发生错误,但是发现这个事件不具备某些条件了,所以操作系统就会自发的向进程发送信号。
举例1:比如在某个进程里创建了一个管道,读端被关闭了,操作系统检测到之后认为没有必要在进行写了,所以操作系统就会自发的向该进程发送13号信号:SIGPIPE 来关闭写端,从而终止该进程。
举例2:比如14号信号:SIGALRM,这个信号叫做超时信号。如果我们在某个进程中用alarm函数设定了一个闹钟,那么闹钟一旦超时之后,操作系统就会给该进程发送SIGALRM。
来看一段代码:
在这里插入图片描述

4.进程出现异常,触发了软硬件的异常,操作系统就会给进程发送信号

举例1:比如说,我们此时写了一个除法运算的程序,但是在该程序的代码中,我们出现了除0操作。那么在编译运算期间,CPU就会检测到你的除0非法操作,所以此时CPU就会告诉操作系统,然后操作系统就会给该进程发送8号SIGFPE信号(floating point exception:浮点数异常),然后这个进程就会在合适的时间对信号进行处理。
举例2:比如说,我们此时在代码里不小心写了一个野指针,那么这个指针会指向任意位置,这是不被允许的,那么在进行虚拟内存地址空间映射到物理内存的这个过程中,MMU就会对页表进行检查,此时MMU就发现了这是不对的,所以MMU就会告诉操作系统,然后操作系统就会给该进程发送11号SIGSEGV信号(segmentation fault:段错误),然后这个进程就会在合适的时间对信号进行处理。

进程怎么知道信号产生了?

  • 实际执行信号的处理动作称为信号递达(Delivery)
  • 信号从产生到递达之间的状态,称为信号未决(Pending)。
  • 进程可以选择阻塞 (Block )某个信号。
  • 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。
    (注意:阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作)

描述进程用的是PCB,信号就是要么产生要么没产生,所以最好的记录信号的方法就是位图(0-31对应的比特位代表信号的编号,比特位的内容代表是或否产生信号),所以在进程PCB里会用位图来记录信号的产生,当进程发现PCB里的位图对应的比特位由0变为1时,就知道产生了对应的信号,然后会在合适的时候进行信号的处理。信号是由操作系统直接或间接产生的,发信号的本质是修改PCB中位图对应的比特位(把对应信号的比特位从0变为1),修改PCB只能通过操作系统修改,因此信号是由操作系统直接或间接产生的。
那么在PCB中描述阻塞信号和未决信号都用的是位图,分别是block表和pending表,31个信号对应的信号操作都是函数,因此在PCB中还有一个函数指针数组来存放信号处理动作的函数的地址,我们称其为handler表。

具体通过这张图来理解信号在内核中的表示:
在这里插入图片描述
所以当操作系统给进程发送信号时,进程PCB内部的这两个位图表就会记录信号的状态,并且在合适的时间通过这个函数指针数组来找到对应信号的处理动作,从而实现信号的递达。

信号的处理动作有哪些?

信号不是被立即处理的而是在合适的时候。
那么信号的处理动作有哪些呢?
1.默认动作
2.忽略动作
3.自定义动作:信号捕捉

关于信号捕捉以及怎么进行信号捕捉请戳我的这篇文章鸭:https://blog.csdn.net/ETalien_/article/details/86498901

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值