sigemptyset、sigaddset、sigprocmask的用法 信号未决,信号阻塞 信号的捕捉

下图表明了在linux系统中,信号的大致关系:


下面介绍一个简单的小例程:


该例程解释如下:

先设置两个信号集参数,s  p

sigemptyset是将s的信号集先清空,sigaddset就是把SIGINT加入到s的信号集中,即该位设为1,堵塞。

sigprocmask函数中的参数SIG_BLOCK 的作用是将s集合与set集合相或操作,

于是set的信号集中的第二位被设置为阻塞,NULL 表明不关心信号set集中原

有的内容。当按下ctrl+c时,由于

阻塞信号集的第二位设为1,信号未被处理,呈现出未决态。

测试结果:


程序运行时,每秒钟把各信号的未决状态打印一遍,由于我们阻塞了SIGINT信号,按Ctrl-C将会使SIGINT信号处于
未决状态,按Ctrl-\仍然可以终止程序,因为SIGQUIT信号没有阻塞。


函数的声明如下:


sigemptyset 函数初始化信号集合set,将set 设置为空.

sigfillset 也初始化信号集合,只是将信号集合设置为所有信号的集合.

sigaddset 将信号signo 加入到信号集合之中,

sigdelset 将信号从信号集合中删除.

sigismember 查询信号是否在信号集合之中.s

igprocmask 是最为关键的一个函数.在使用之前要先设置好信号集合set.

这个函数的作用是将指定的信号集合set 加入到进程的信号阻塞集合之中去,

如果提供了oset 那么当前的进程信号阻塞集合将会保存在oset 里面.

参数how 决定函数的操作方式:
SIG_BLOCK:增加一个信号集合到当前进程的阻塞集合之中.
SIG_UNBLOCK:从当前的阻塞集合之中删除一个信号集合.
SIG_SETMASK:将当前的信号集合设置为信号阻塞集合.




信号捕获:


图解



函数的结构声明:



例程为:



其中 do_sig是一个函数,在翻译的时候会被翻译成一个地址


紧接着第二步是清空信号集。


handler有三种状态,已经在第一张图中列出来了


do_sig 还可以设成 忽略 和默认两种形式,SIG_IGN等查手册!



结果为:


  • 15
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值