PCB的信号集

2019-07-14 11:54发布

      每一个进程都有一个PCB(进程控制块),在PCB中有两个信号集,分别是未决信号集和阻塞信号集。        其中未决信号集是记录有没有信号来临,一旦有信号来临则该信号位置1,如下图中有2号信号来临,则将2号未决信号集置1,然后未决信号集再将该信号像阻塞信号集传递,如果对应2号信号集的位是1,则表示阻塞,该信号被阻塞在了阻塞信号集上无法到达句柄,该信号处于未决态。若阻塞信号集的2号信号位是0,则2号信号可以抵达句柄,进行动作。该信号此时处于递达态。         一旦信号处于递达态,则不再是未决信号,所以未决信号集对应信号位翻转为0.         未决信号集用户只有读权限,没有修改的权限。这是系统自动设定的。但是阻塞信号集用户是可以自己设定的。        信号集对于前32个信号来说是不支持排队的,意思就是说,你发送了一个信号过来给未决信号集,未决信号集对应信号位置1,你在发送几个相同的信号,未决信号集及记录一个。但是要是在之前那个信号变为递达态的时候在发送过来就可以被记录。        但是对后32 个信号是支持排队的。就像你看电视频就可以下一集,对按几次就会跳多集,道理是一样的。        那么,我们该如何设置信号集呢,把自己不想通过的信号阻塞掉呢,现有一些函数可以解决这一问题 sigset_t为信号集,可sizeof(sigset_t)察看
int sigemptyset(sigset_t *set)//将信号集置0;
int sigfillset(sigset_t *set)//将信号集置1;
int sigaddset(sigset_t *set, int signo)//添加你想要的信号到指定信号位中。
int sigdelset(sigset_t *set, int signo)//将指定位的信号集置0;
int sigismember(const sigset_t *set, int signo)//判断某个信号是否置1 这组函数并没有直接改变未决信号集,或者阻塞信号集。这组函数是先构造一个信号集,如下所示: 然后再通过注册的方式将自己构造的信号集注册进阻塞信号集。。                                                                                                阻塞信号集也叫做当前进程的信号屏蔽字(Signal Mask),这里的“屏蔽”应该理解为阻塞而不是忽略。       其中调用函数sigprocmask可以读取或更改进程的信号屏蔽字。(这个函数就相当于注入了,直接将你创建的信号集注入信号屏蔽字也就是阻塞信号集中)       int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
      返回值:若成功则为0,若出错则为-1 int sigpending(sigset_t *set);      sigpending读取当前进程的未决信号集,通过set参数传出。调用成功则返回0,出错则
返回-1。