【版权申明】转载请附上出处链接
Linux应用编程中的信号阻塞sigset_t与sigprocmask()
信号(signal)是一种软中断,是进程间通信的一种方式,为异步通知。
信号屏蔽就是在进程中阻塞我们指定的信号集,这些信号将得不到该进程的处理,使得他们看起来被“忽略”了,但是实际上它们是被阻塞了。
忽略,意味着信号被处理了,只不过不做任何操作;
阻塞,意味着信号得不到处理,该信号将一直存在。
1. 关于sigset_t
typedef struct {
unsigned long sig[_NSIG_WORDS];
} sigset_t
该结构体只是一个unsigned long型的数组,
2. 关于信号阻塞函数sigprocmask
// 头文件:
#include <signal.h>
/**
* @params how, 信号阻塞的方式
SIG_BLOCK 该进程的信号阻塞是当前阻塞和set指向的阻塞的并集
SIG_UNBLOCK 该进程的信号阻塞是当前阻塞和set指向的阻塞的补集的交集
SIG_SETMASK 该进程的信号阻塞要被set指向的信号阻塞代替
* @params set, 这个信号集设为新的当前信号阻塞,如果为NULL则不改变
* @params oldset, 保存进程旧的信号屏蔽字,如果为NULL则不保存
*
* @return 0 on success and -1 on error. In the event of an error, errno is set to indicate the cause.
*/
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
3. 信号阻塞函数sigprocmask的相关函数
#include<signal.h>
// 将信号集合清空,并且初始化
int sigemptyset(sigset_t *set);
// 参数set信号集初始化,然后把所有的信号加入到此信号集里(即将所有的信号标志位置为1),阻塞所有的信号
int sigfillset(sigset_t *set);
// 将要屏蔽的型号加入到信号屏蔽集里去
int sigaddset(sigset_t *set, int signum);
// 将参数signum代表的信号从参数set信号集里删除
int sigdelset(sigset_t *set, int signum);
// 测试参数signum代表的信号是否已加入至参数set信号集里
int sigismember(const sigset_t *set, int signum);
4. 举个例子
#ifdef __hpux
/* on hpux, we must block sigalrm on the main process, because signal delivery
is ?random?, well, sometimes the SIGALRM goes to both the main thread and the
scheduler thread */
sigset_t set;
sigemptyset(&set);
sigaddset(&set,SIGALRM);
sigprocmask(SIG_BLOCK,&set,NULL);
#endif /* __hpux */