信号递达(handler):实际执行信号的处理动作,
信号未决(pending):信号从产生到递达之间的状态,
信号阻塞(block):被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。
【注意】:阻塞和忽略是不同的,只要信号被阻塞,就不会递达,而忽略是在递达之后会选择的一种动作。
对于信号1:没有阻塞,也没有产生过,如果递达则执行默认动作;
对于信号2:产生过,现在正在阻塞,如果递达则忽略该信号,但是在递达前可能会更改递达后操作;
对于信号3:没有产生过,如果产生则会阻塞该信号,递达后的动作是执行用户自定义的程序。
下面尝试接受2号信号,查看进程的pending表:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void showpending(sigset_t* pending)
{
int i=1;
for(i; i<=31;i++)
{
if(sigismember(pending, i))
{
printf("1");
}
else
{
printf("0");
}
}
printf("\n");
}
int main()
{
sigset_t blockset, oblockset, pending;
sigemptyset(&blockset);
sigemptyset(&oblockset);
sigaddset(&blockset, 2);
sigprocmask(SIG_SETMASK, &blockset, &oblockset);
int count = 0;
while(1)
{
sigpending(&pending);
showpending(&pending);
sleep(1);
if(++count == 10)
{
sigprocmask(SIG_SETMASK, &oblockset, NULL);
printf("recover proc block set!\n");
}
}
}
上面程序只能接受一次2号信号。
如果要多次接受2号信号,只需要加一个循环就行了。