sigprocmask阻塞信号

有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数

1. 信号阻塞和忽略信号的区别
操作系统在信号被进程解除阻塞之前不会将信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递。当进程忽略一个信号时,信号会被传递出去但进程会将信号丢弃

2. sigprocmask

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

改变进程的当前阻塞信号集,也可以用来检测当前进程的信号掩码

how:

  • SIG_BLOCK:将set所指向的信号集中所包含的信号加到当前的信号掩码中,作为新的信号屏蔽字
  • SIG_UNBLOCK:将参数set所指向的信号集中的信号从当前的信号掩码中移除
  • SIG_SETMASK:设置当前信号掩码为参数set所指向的信号集中所包含的信号

oldset:不是NULL指针,那么目前的信号屏蔽字会由此指针返回

注:sigprocmask()函数只为单线程的进程定义的,在多线程中要使用pthread_sigmask变量,在使用之前需要声明和初始化

3. 设置方法
SIG_BLOCK,SIG_UNBLOCK成对实现。可以不用关心oldset

4. 示例

sigemptyset(&set); //初始化信号量集  
sigaddset(&set,SIGTSTP); //将SIGTSTP添加到信号量集中  
sigaddset(&set,SIGINT);//将SIGINT添加到信号量集中  
sigprocmask(SIG_SETMASK,&set,&oldset); //将set中的SIGINT,SIGTSTP阻塞掉,并保存当前信号屏蔽字  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值