Linux应用编程中的信号阻塞sigset_t与sigprocmask()

【版权申明】转载请附上出处链接 

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 */
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安河桥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值