【linux 信号学习八】信号掩码

文章目录

概述

内核为每一个进程维护了一组信号掩码(其实就是一组信号集合)。当进程接收到一个属于信号掩码中的信号时,该信号将会被阻塞,无法传递进程进行处理。内核会将该信号阻塞,直到该信号从信号掩码中删除内核才会把信号传递给进程,从而得到处理。
向信号添加信号掩码的方法:

  • 应用程序调用signal()函数或sigaction()函数为某一信号设置处理方式时,会自动将改信号添加到信号掩码中。对于sigaction函数是否会添加和SA_NODEFER标志有关。当信号处理函数结束返回后,信号自动从信号掩码中移除
  • 使用sigaction()函数设置信号处理方式时,可以额外指定一组信号,当调用信号处理程序时,自动将信号添加到信号掩码中,处理程序结束后,自动移除
  • 使用sigpromask()函数添加,随时可以显示的像信号掩码中添加/移除信号。

sigpromask

作用:根据指定的方法修改进程当前阻塞信号集,也可以用来检测当前进程的信号掩码。
函数原形

int sigpromask(int how, const sigset_t *set, sigset_t *oset);

新的信号屏蔽字由参数set指定,原来的信号屏蔽字保存在oset中。如果set为空,则how没有意义,但此时调用该函数的意义是将当前的信号屏蔽字保存到oset中。
参数

how:方法
set:新的信号屏蔽字
oset:来保存原来的信号屏蔽字

how的取值:

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

返回值

成功:0
失败:-1,并设置errno表示原因

注意:只有调用了这个函数才能改变进程的屏蔽字
补充

  1. 每个进程都有一个用来描述哪些信号递送到进程时将被阻塞的信号集,该信号集中的所有信号在递送到进程后都将被阻塞。
  2. sigprocmask()函数只为单线程的进程定义,多线程要使用pthread_sigmask变量,在使用之前需要进行声明和初始化。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值