信号掩码和信号集之间有什么关系和区别?

时间:2018-05-30 21:03:11

标签: linux signals

来自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);

感谢。

1 个答案:

答案 0 :(得分:1)

信号掩码是进程的属性,即阻塞的信号列表。 sigprocmask检索和/或更新流程的此属性。

信号集是保存信号编号列表的数据类型。 sigaddsetsigdelset用于修改包含此数据的对象。

如果要设置或检索进程的信号掩码,sigprocmask()系统调用将使用类型为sigset_t*的参数来保存指向此列表的指针。

这类似于流程ID与pid_t之间的关系。

因此,如果要修改进程的信号掩码,可以执行以下操作:

  1. 使用空sigprocmask()和非空set参数调用oset以获取sigset_t变量中的当前流程掩码。
  2. 致电sigaddset()和/或sigdelset()以添加和删除该变量中的信号。
  3. 使用包含更新信号集的sigprocmask()how = SIG_SETMASK致电set
  4. 如果您只想添加或删除掩码中的信号,而不是两者,则可以使用SIG_BLOCKSIG_UNBLOCK操作在sigprocmask的单个调用中执行此操作。只需创建一个包含要添加或删除的信号的信号集,它们就会与现有的掩码合并。