目录
在信号这部分还有一个很重要的知识点:信号阻塞。因此本文来简单聊一聊信号阻塞相关的内容。
一、理解信号阻塞
阻塞信号,就是暂时不处理这个信号。 就像是过马路的时候,过马路是一个进程,红灯是一个信号,本来接收到这个信号后,我们需要执行这个信号的处理函数(等待绿灯到来后通过马路)。可是有人就是要闯红灯,这里就是把红灯信号给阻塞了。
为了方便对阻塞的信号进行管理,在pcb中有一个block信号阻塞集合。在这个集合中标记了哪个信号,就表示要阻塞哪个信号。当进程收到了这个信号,就暂时不去处理这个信号。
因此如果要阻塞某个信号,就需要把该信号添加到信号阻塞集合。因此本文简单介绍如何给信号阻塞集合添加信号,如何修改信号阻塞集合等。
二、操作接口
1.sigprocmask
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset)
作用:修改信号阻塞集合
- how:要对阻塞集合进行的操作
- set:要操作的信号集合
- oldset:用于保存修改前block集合中的数据
返回值:成功返回0,失败返回-1
how选项的操作共三种:
- SIG_BLOCK:将set集合中的信号添加到block集合中
- SIG_UNBLOCK:将set集合中的信号从block集合移除
- SIG_SETMASK:用set集合中的信号替换掉block集合中的所有信号
2.sigemptyset
int sigemptyset(sigset_t * set)
作用:清空指定集合
- sigset_t * set:要清空的信号集合
返回值:成功返回0,失败返回-1
3.sigfillset
int sigfillset(sigset_t * set)
作用:填充所有信号到set集合中
- sigset_t * set:指定的信号集合
4.sigaddset
int sigaddset(sigset_t * set,int signum)
作用:添加指定信号到集合中
- sigset_t * set:要添加信号的集合
- int signum:要添加的信号
返回值:成功返回0,失败返回-1
5.sigdelset
int sigdelset(sigset_t * set,int signum)
作用:从指定集合中移除指定信号
- sigset_t * set:要移除信号的集合
- int signum:要移除的信号
返回值:成功返回0,失败返回-1
6.sigismember
int sigismember(const sigset_t * set,int signum)
作用:判断指定信号是否在集合中
- sigset_t * set:要判断的集合
- int signum:要判断的信号
返回值:如果该信号在集合中返回1,否则返回0
三、特殊信号
下面两个信号不会被阻塞,不会被忽略,处理函数无法修改:
- SIGKILL(9号)
- SIGSTOP(19号)