Linux:信号的捕捉过程以及信号捕捉函数

信号的捕捉过程以及信号捕捉函数

信号的捕捉过程

我们都说信号的产生之后不是被立即处理的,而是在合适的时候,那么合适的时候是什么时候呢?信号又是怎么被捕捉的呢?

合适的时候是指:从内核态切换为用户态时进行信号的捕捉

在Linux下,我们会发现我们有时候会有一些文件不能进入,有一些文件不能创建,其实这就是一种权限。内核态和用户态都是一种状态,这两种状态表示了两种身份,这两种身份表示了不同的权限等级,我们在访问0-3G的地址空间时,我们用的是用户权限,而我们通过系统调用接口以及我们想要访问地址空间里的3-4G空间时,我们就需要把自己的身份从内核态转换为用户态。因此,内核态和用户态最大的区别就是权限,内核态允许访问3-4G的空间。
在这里插入图片描述
比如某个进程想要访问3-4G内存,操作系统就会把这个进程劫持了,你必须要拿我(操作系统)的身份来访问,这3-4G的空间是这个进程的,但是又用这个进程访问了操作系统的资源,而且还要受操作系统的管控。

从用户态到内核态的过程是权限升级的过程,而从内核态到用户态的过程是要从安全方面考虑的,因为操作系统不相信任何人,只相信它自己,所以要想要访问操作系统内部进行访问时必须通过系统调用接口。操作系统的代码只能由操作系统执行,用户的代码就只能由用户执行,因此就会有内核态和用户态两种状态之间的相互转变。

信号的捕捉过程

假如我们现在在运行一个程序,在运行过程中突然碰到系统调用接口了,此时就从用户态陷入内核态了,在内核当中我就要开始执行这段代码了,那么现在我执行完了这段代码了,我要准备返回主控制流程了,在这个时候,我检查一下有没有需要被递达的信号,忽略和默认这两种处理动作非常简单,处理之后直接返回主控制流程了,但是自定义信号处理动作就不一样了,如果我此时检测到有信号需要被处理,而且还是用户自定义的处理动作,那么此时我就会从内核态返回用户态,然后去执行自定义的处理动作,我执行完了这段自定义处理动作的代码之后,就又从用户态陷入内核态了,此时再通过特殊的系统调用接口sigreturn返回用户态,回到主控制流程刚刚被中断的地方继续向下执行,这个阶段就是信号的捕捉过程。

通过我画的这幅图深刻理解信号捕捉的过程:
在这里插入图片描述

信号捕捉函数(2个)

1.signal

#include <signal.h>
sighandler_t signal(int signum, sighandler_t handler);

函数的使用(捕捉2号信号)
在这里插入图片描述

2.sigaction

#include <signal.h>
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);

函数的使用(捕捉2号信号)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ETalien_/article/details/86498901
今日推荐