我们应该如何理解我们调用系统接口并不是简单的调用系统接口这么简单就完事了---我们有时候也是需要使用由操作系统为我们提供的操作系统的层面的数据类型
sigset_t
我们来介绍一种类型,从我们之前学的图来看,每一个信号不管是在block表还是在pending表当中,它只有一个比特位来标识未决,非0即1,不记录该信号产生多少次,实际上pending和block这两个位图我们可以用相同的类型来表示的,在linux操作系统当中这种数据类型我们称为sigset_t
如果你告诉我这个pending和信号屏蔽字是位图,那我自己直接做按位与,按位或,就搞定了,操作系统是不允许你这样子干的,操作系统给你提供了 sigset_t 类型,给你提供的,你自己把你的sigset_t 变量设置好,然后传给我,我在设置
说白了我们的sigset_t就是我们的信号集,也就是位图结构,它表示有效和无效这种概念
sigset_t 在表示pending时,表示的概念就是有还是没有对应的信号
sigset_t 在表示信号屏蔽字时,表示的概念就是该信号是否被阻塞
set是一个变量,该变量在什么对方保存???和我们之前用到的int,double,没有任何差别,都是在用户栈上
我们现在要做的就是修改这个sigset ,并且还要把sigset修改后的值呢写到我们的操作系统里
接下来我们怎么去设置与进程信号相关的内容呢??也就是pending和block位图表
sigprocmask
sigprocmask作用是用来修改当前进程的block位图
所以说我将31个信号都给屏蔽了,或者将所有信号都自定义捕捉了,写了一个无坚不摧的进程是不存在的,因为我的9号信号不能被屏蔽,也不能被自定义捕捉,可以杀死你的进程
---------------------------------------------------------------------------------------------------------------------------------
sigpending
sigpending的作用不对pending位图做修改,而只是单纯的获取进程的pending位图
我们现在就很好奇了,你不对pending位图做修改,那么pending位图谁来改呢??主要是你没必要改,pending收信号就可以了,没有修改的必要
-----------------------------------------------------------------------------------------------------------------------
如果我的进程预先屏蔽掉2号信号,然后我不断的获取当前进程的pending位图,并打印显示(刚开始没有发送2号信号的时候打印的一定全是 00000000000000000000...)然后我手动发送2号信号,因为2号信号不会被递达,所以,当我不断在进行打印的时,能明显感受到有一个比特位设为1了,同时因为改信号不能被递达,所以永远只能被保留在pending位图里
-----------------------------------------------------------------------------------------------------------------------------
我们可以对2号信号进行捕捉,自定义我们对2号信号的执行动作,就可以看到我们想看到的现象!!!