首页 文章

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

提问于
浏览
-1

来自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 回答

  • 1

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

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

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

    它类似于进程ID和 pid_t 之间的关系 .

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

    • 使用null set 和非null oset 参数调用 sigprocmask() 以获取 sigset_t 变量中的当前进程掩码 .

    • 调用 sigaddset() 和/或 sigdelset() 添加和删除该变量的信号 .

    • 使用包含更新信号集的 how = SIG_SETMASKset 调用 sigprocmask() .

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

相关问题