<aside>
💡 信号集:许多信号相关的系统调用都需要能表示一组不同的信号,多个信号可使用一个称之为信号集的数据结构来表示,其系统数据类型为 sigset_t。
</aside>
信号集使用位图机制实现(64位,每一位代表一个信号)

未决信号集与阻塞信号集
未决信号集与阻塞信号集存放在PCB中

未决信号集与阻塞信号集的工作原理
一个例子—— Ctrl + C
- 用户通过键盘 Ctrl + C, 产生2号信号SIGINT (信号被创建)
- 信号产生但是没有被处理 (未决)
- 在内核中将所有的没有被处理的信号存储在一个集合中 (未决信号集)
- SIGINT信号状态被存储在第二个标志位上
- 这个标志位的值为0, 说明信号不是未决状态
- 这个标志位的值为1, 说明信号处于未决状态
- 这个未决状态的信号需要被处理,处理之前需要和另一个信号集(阻塞信号集)进行比较
- 阻塞信号集默认不阻塞任何的信号
- 如果想要阻塞某些信号需要用户调用系统的API
- 在处理的时候和阻塞信号集中的标志位进行查询,看是不是对该信号设置阻塞了
- 如果没有阻塞,这个信号就被处理
- 如果阻塞了,这个信号就继续处于未决状态,直到阻塞解除,这个信号就被处理
信号集相关的函数

<aside>
💡 以下信号集相关的函数都是对自定义的信号集进行操作
</aside>
sigemptyset
int sigemptyset(sigset_t *set)
- 功能:清空信号集中的数据,将信号集中的所有的标志位置为0
- 参数:
set
,传入传出参数,需要操作的信号集
- 返回值:成功返回0, 失败返回-1