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