信号在几种情况下会进入阻塞状态,一是信号处理函数的执行过程中,该信号将被阻塞,直道信号函数执行完成,该阻塞将会解除。这种机制的主要作用是避免信号的嵌套;第二
中情况是通过sigaction进行信号安装时,如果设置了sa_mask阻塞信号集,则该信号集中的信号在信号处理函数被执行期间将会阻塞,还有另外一种情况下信号将会进入阻塞,
这就是通过系统调用sigpromask,可以通过该系统调用制定阻塞某个或者几个信号。第一种情况是系统自动阻塞的,后面两种情况是认为设置信号阻塞。
第二种情况是当信号处理函数正在执行过程,可能有其他的信号到来,此时,当前的信号处理函数就会被中断,而这往往是不希望发生的。此时可以通过sigaction系统调用的信号
阻塞掩码对相关信号进行阻塞,通过这种阻塞信号。在信号处理函数执行结束后就会接触。第三种情况较多:典型情况某个信号处理函数与程序代码都要对某个共享数据区进行读
写。如果进程收到了该信号,则程序的读写过程被中断而执行信号处理函数,而信号处理函数对该数据共享区进行读写,此时共享数据区就会发生混乱。这种情况下,需要在程序
读写发生混乱。这种情况下需要在读写共享区前阻塞信号,在读写完成后再接触信号阻塞。
#include <stdio.h>
#include <signal.h>
void handle_sigint(int signo)
{
printf("receive signal %d\n",signo);
}
int main()
{
sigset_t mask;//信号掩码结构变量,用于指定新的信号掩码
sigset_t omask;//信号掩码结构题变量,用来保存原来的信号处理掩码
signal(SIGINT,handle_sigint);//安装信号
sigemptyset(&mask);//清空信号处理掩码
sigaddset(&mask,SIGINT);//向掩码结构增加SIGINT
sigprocmask(SIG_BLOCK,&mask,&omask);//设置掩码,设置完成SIGINT信号将被阻塞
sleep(10);
sigprocmask(SIG_SETMASK,&omask,NULL);//恢复原有的信号处理掩码
return 0;
}