信号集
信号集
阻塞信号集:sigprocmask()函数
? 有的进程想延迟处理一些信号,但又不能忽略,于是就有了阻塞信号的需求。将一些信号值添加到阻塞信号集记录,这些信号发送给进程时进程收不到信号(相当于黑名单),然后将这些信号移除阻塞信号集,进程会立马收到这些信号,进而进行处理。
? 信号集类型是sigset_t
本质是位图。但不应该直接使用位操作,而应该使用上述函数,保证跨系统操作有效。 相关函数如下:
#include
int sigemptyset(sigset_t *set); //将set集合置空
int sigfillset(sigset_t *set); //将所有信号加入set集合
int sigaddset(sigset_t *set, int signo); //将signo信号加入到set集合
int sigdelset(sigset_t *set, int signo); //从set集合中移除signo信号
int sigismember(const sigset_t *set, int signo); //判断信号是否存在
? 用这些函数操作好一个信号集后,就可以将其传入sigprocmask()
函数
#include
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
- 功能:
检查或修改信号阻塞集,根据 how 指定的方法对进程的阻塞集合进行修改,新的信号阻塞集由 set 指定,而原先的信号阻塞集合由 oldset 保存。 - 参数:
- how : 信号阻塞集合的修改方法,有 3 种情况:
SIG_BLOCK
: mask = mask|setSIG_UNBLOCK
:mask = mask &(~ set)SIG_SETMASK
:mask = set
- set : 要操作的信号集地址。
- oldset : 保存原先信号阻塞集地址
- how : 信号阻塞集合的修改方法,有 3 种情况:
- 返回值:
成功:0,
失败:-1,失败时错误代码只可能是 EINVAL,表示参数 how 不合法。
未决信号集:sigpending()函数
#include
int sigpending(sigset_t *set);
- 功能:读取当前进程的未决信号集
- 参数:
set:未决信号集 - 返回值:
成功:0
失败:-1