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等查手册!
结果为: