sigset_t
号集及信号集操作函数:信号集被定义为一种数据类型:
typedef struct {
unsigned long sig[_NSIG_WORDS];
} sigset_t
信号集用来描述信号的集合,linux所支持的所有信号可以全部或部分的出现在信号集中,主要与信号阻塞相关函数配合使用。下面是为信号集操作定义的相关函数:
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum)
int sigdelset(sigset_t *set, int signum);
int sigismember(const sigset_t *set, int signum);
头文件
#include <signal.h>
sigemptyset(sigset_t *set)初始化由set指定的信号集,信号集里面的所有信号被清空;
sigfillset(sigset_t *set)调用该函数后,set指向的信号集中将包含linux支持的64种信号;
sigaddset(sigset_t *set, int signum)在set指向的信号集中加入signum信号;
sigdelset(sigset_t *set, int signum)在set指向的信号集中删除signum信号;
sigismember(const sigset_t *set, int signum)判定信号signum是否在set指向的信号集中。
pthread_sigmask
POSIX 线程 – pthread_sigmask
在多线程的程序里,希望只在主线程中处理信号,可以使用该函数。
POSIX线程– pthread_sigmask
在多线程的程序里,希望只在主线程中处理信号,可以使用
函数:
int pthread_sigmask (int how,const sigset_t *set,sigset_t *oset)
用作在主调线程里控制信号掩码。
How:
SIG_BLOCK:结果集是当前集合参数集的并集;SIG_UNBLOCK:结果集是当前集合参数集的差集;SIG_SETMASK:结果集是由参数集指向的集
头文件:<signal.h>
错误:[EINVAL] how不是已定义值
提示:除非信号在所有的线程里都阻塞,否则总能将异步信号传输给这个进程。
提示:除非信号在所有的线程里都阻塞,否则总能将异步信号传输给这个进程。
解释:
每个线程均有自己的信号屏蔽集(信号掩码),可以使用pthread_sigmask函数来屏蔽某个线程对某些信号的
响应处理,仅留下需要处理该信号的线程来处理指定的信号。实现方式是:利用线程信号屏蔽集的继承关系
(在主进程中对sigmask进行设置后,主进程创建出来的线程将继承主进程的掩码)
static const int exceptsigs[] = { SIGCHLD, SIGIO, SIGURG, SIGWINCH, SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU, SIGCONT, -1, }; sigset_t sigset; sigfillset(&sigset); for (i = 0; exceptsigs[i] != -1; i++) { sigdelset(&sigset, exceptsigs[i]); } pthread_sigmask(SIG_BLOCK, &sigset, NULL);