linux - 信号掩码和信号集有什么关系和区别?
问题描述
来自 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);
谢谢。
解决方案
信号掩码是进程的一个属性,即被阻塞的信号列表。sigprocmask
检索和/或更新进程的此属性。
信号集是一种保存信号编号列表的数据类型。sigaddset
并sigdelset
用于修改包含此数据的对象。
当您要设置或检索进程的信号掩码时,sigprocmask()
系统调用会采用一个参数,该参数的类型是sigset_t*
保存指向此列表的指针。
这类似于进程 ID 和pid_t
.
因此,如果要修改进程的信号掩码,可以执行以下操作:
sigprocmask()
使用 nullset
和非 null参数调用oset
以获取sigset_t
变量中的当前进程掩码。- 调用
sigaddset()
和/或sigdelset()
从该变量中添加和删除信号。 - 调用
sigprocmask()
并包含更新how = SIG_SETMASK
的set
信号集。
如果您只想从掩码中添加或删除信号,而不是两者,您可以使用SIG_BLOCK
andSIG_UNBLOCK
操作在一次调用中完成sigprocmask
。只需创建一个包含您要添加或删除的信号的信号集,它们就会与现有的掩码合并。
推荐阅读
- node.js - 在 mongoose + nodeJS 中检测到循环依赖
- node.js - 使用 Nodejs 和 AWS 处理耗时的操作
- java - 改造 - GET 后的空对象
- algorithm - 将整数散列为字母数字而没有冲突
- php - ElasticSearch:查询多个字段
- sql-server - SQL Format date to YYY-MM-DD 00:00:00.000
- sql - 使用多个 Select 和 Join 语句将多个数据插入表中
- lotus-domino - IBM Domino:view.refresh 后第一次视图加载缓慢
- networking - 队列为空后的加权循环
- sas - 锁不适用于 MYLIB.SASMACR.CATALOG