Unix信号-信号集sigset_t

时间:2024-11-18 07:15:23

由于不同的信号数量可能会超过一个整型数的位数,Unix提供的系统基本数据类型sigset_t被广泛用于信号相关的API,如果我们需要查看或设置未决信号集或阻塞信号集,往往都要通过sigset_t参数进行操作。POSIX标准定义了有关于信号集数据类型的5的API

#include <signal.h>
int sigemptyset(sigset_t* set);  //将信号集所有位都置0
int sigfillset(sigset_t* set);   //将信号集所有位都置1
int sigaddset(sigset_t* set,int signo); 	 //信号集某一位(特定信号)置1
int sigdelset(sigset_t* set,int signo);      //信号集某一位置0
int sigismember(const sigset_t* set,int signo);  //判断某一位是否为1

POSIX规定在使用信号集数据类型必须先调用sigemptyset或sigfillset进行初始化操作

sigprocmask

sigprocmask可以查改进程的阻塞信号集(信号屏蔽字),它只适用于单线程进程

int sigprocmask(int how,const sigset_t* set,sigset_t* oset);
//oset用于返回当前信号屏蔽字
//set和how共同绝对对信号屏蔽字的处理

how的取值

  • SIG_BLOCK : set对原信号屏蔽字进行新增操作
  • SIG_UNBLOCK :set对原信号屏蔽字进行删除操作
  • SIG_SETMASK :set对原信号屏蔽字进行覆盖操作

sigpending

sigpending可以查进程的未决信号集

int sigpending(sigset_t* set);

sigpending返回的信号集,比特位为1的信号因被阻塞而不能被传递。因此处于挂起状态。