首页 > 解决方案 > 信号掩码和信号集有什么关系和区别?

问题描述

来自 APUE

每个进程都有一个信号掩码,它定义了当前阻止传递给该进程的信号集。我们可以认为这个掩码对于每个可能的信号都有一个位。如果给定信号的该位打开,则该信号当前被阻塞。进程可以 通过调用 sigprocmask 来检查和更改其当前的信号掩码,我们在 10.12 节中对此进行了描述。

由于信号的数量可能超过整数中的位数,因此 POSIX.1 定义了一种数据类型,称为 sigset_t,它包含一个信号集。例如,信号掩码存储在这些信号集中之一中。我们 在 10.11 节描述了对信号集进行操作的五个函数。

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

信号桅杆是数据吗?信号集是对象吗,因为数据存储在对象中?

之间有什么区别,我们什么时候使用 which:

#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);

谢谢。

标签: linuxsignals

解决方案


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

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

当您要设置或检索进程的信号掩码时,sigprocmask()系统调用会采用一个参数,该参数的类型是sigset_t*保存指向此列表的指针。

这类似于进程 ID 和pid_t.

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

  1. sigprocmask()使用 nullset和非 null参数调用oset以获取sigset_t变量中的当前进程掩码。
  2. 调用sigaddset()和/或sigdelset()从该变量中添加和删除信号。
  3. 调用sigprocmask()并包含更新how = SIG_SETMASKset信号集。

如果您只想从掩码中添加或删除信号,而不是两者,您可以使用SIG_BLOCKandSIG_UNBLOCK操作在一次调用中完成sigprocmask。只需创建一个包含您要添加或删除的信号的信号集,它们就会与现有的掩码合并。


推荐阅读