来自APUE
每个进程都有一个信号掩码,用于定义当前阻止传递到该进程的信号集 . 我们可以认为这个掩码对于每个可能的信号都有一位 . 如果该位为给定信号打开,则该信号当前被阻止 . 进程可以通过调用sigprocmask检查和更改其当前信号掩码,我们在第10.12节中对此进行了描述 . 由于信号数量可能超过整数中的位数,POSIX.1定义了一个数据类型,称为sigset_t,它保存一个信号集 . 例如,信号掩码存储在这些信号集之一中 . 我们在第10.11节中描述了对信号集进行操作的五个函数 .
信号掩码和信号集之间有什么关系和区别?
信号是一个数据,是一个信号设置一个对象,因为一个数据存储在一个对象中?
我们之间有什么区别,以及何时使用哪些:
#include <signal.h>
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
和
#include <signal.h>
int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);
谢谢 .
1 回答
信号掩码是进程的属性,即阻塞的信号列表 .
sigprocmask
检索和/或更新流程的此属性 .信号集是保存信号编号列表的数据类型 .
sigaddset
和sigdelset
用于修改包含此数据的对象 .如果要设置或检索进程的信号掩码,
sigprocmask()
系统调用将采用类型为sigset_t*
的参数来保存指向此列表的指针 .它类似于进程ID和
pid_t
之间的关系 .因此,如果要修改进程的信号掩码,可以执行以下操作:
使用null
set
和非nulloset
参数调用sigprocmask()
以获取sigset_t
变量中的当前进程掩码 .调用
sigaddset()
和/或sigdelset()
添加和删除该变量的信号 .使用包含更新信号集的
how = SIG_SETMASK
和set
调用sigprocmask()
.如果您只想添加或删除掩码中的信号,而不是两者,则可以使用
SIG_BLOCK
和SIG_UNBLOCK
操作在一次调用sigprocmask
中执行此操作 . 只需创建一个包含要添加或删除的信号的信号集,它们就会与现有的掩码合并 .