Linux下C编程:sigprocmask阻塞历程
1、有时候不但愿在接到信号时就当即遏制当前执行,去处理惩罚信号,同时也不但愿忽略该信号,而是延时一段时间去挪用信号处理惩罚函数。这种环境是通过阻塞信号实现的。
2、信号阻塞和忽略信号的区别。
阻塞的观念和忽略信号是差异的。操纵系统在信号被历程清除阻塞之前不会讲信号通报出去,被阻塞的信号也不会影响历程的行为,信号只是临时被阻止通报。当历程忽略一个信号时,信号会被通报出去但历程会将信号扬弃。
3、信号阻塞系统挪用,它们的都起到阻塞的浸染,它们不是协作利用的。
#include <signal.h>
int sigprocmask(ubt how,const sigset_t*set,sigset_t *oldset);
int sigsuspend(const sigset_t*sigmask);
sigprocmask设定对信号屏蔽集内的信号的处理惩罚方法(阻塞或不阻塞)。
参数:
how:用于指定信号修改的方法,大概选择有三种
SIG_BLOCK//将set所指向的信号会合包括的信号加到当前的信号掩码中。即信号掩码和set信号集举办或操纵。
SIG_UNBLOCK//将set所指向的信号会合包括的信号从当前的信号掩码中删除。即信号掩码和set举办与操纵。
SIG_SETMASK //将set的值设定为新的历程信号掩码。即set对信号掩码举办了赋值操纵。
set:为指向信号集的指针,在此专指新设的信号集,假如仅想读取此刻的屏蔽值,可将其置为NULL。
oldset:也是指向信号集的指针,在此存放本来的信号集。可用来检测信号掩码中存在什么信号。
返回说明:
乐成执行时,返回0。失败返回-1,errno被设为EINVAL。
sigprocmask示例(演示添加信号掩码):
#include <stdio.h>
#include <signal.h>
void checkset();
void main()
{
sigset_tblockset;
sigemptyset(&blockset);
sigaddset(&blockset,SIGINT);
sigaddset(&blockset,SIGTSTP);
checkset();
sigprocmask(SIG_SETMASK,&blockset,NULL);
checkset();
sigaddset(&blockset,SIGTERM);
sigprocmask(SIG_BLOCK,&blockset,NULL);
checkset();
sigdelset(&blockset,SIGTERM);
sigprocmask(SIG_UNBLOCK,&blockset,NULL);
checkset();
}
void checkset()
{
sigset_tset set;
printf("checksetstart:\n");
if(sigprocmask(0,NULL,&set)<0)
{
printf("checksetsigprocmask error!!\n");
exit(0);
}
if(sigismember(&set,SIGINT))
printf("sigint\n");
if(sigismember(&set,SIGTSTP))
printf("sigtstp\n");
if(sigismember(&set,SIGTERM))
printf("sigterm\n");
printf("checksetend\n");
}

sigprocmask示例(演示添某部门代码不被信号打扰):
#include <stdio.h>
#include <signal.h>
void checkset();
void func();
void main()
{
sigset_tblockset,oldblockset,pendmask;
printf("pid:%ld\n",(long)getpid());
signal(SIGINT,func); //信号量捕获函数,捕获到SIGINT,跳转到函数指针func处执行
sigemptyset(&blockset); //初始化信号量集
sigaddset(&blockset,SIGTSTP); //将SIGTSTP添加到信号量会合
sigaddset(&blockset,SIGINT);//将SIGINT添加到信号量会合
sigprocmask(SIG_SETMASK,&blockset,&oldblockset); //将blockset中的SIGINT,SIGTSTP阻塞掉,并生存当前信号屏蔽字
/*执行以下措施时,不会被信号打扰*/
checkset();
sleep(5);
sigpending(&pendmask); //查抄信号是悬而未决的
if(sigismember(&pendmask,SIGINT)) //SIGINT是悬而未决的。所谓悬而未决,是指SIGQUIT被阻塞还没有被处理惩罚
printf("SIGINTpending\n");
/*免打扰竣事*/
sigprocmask(SIG_SETMASK,&oldblockset,NULL); //规复被屏蔽的信号SIGINT SIGTSTP
printf("SIGINTunblocked\n");
sleep(6);
}
void checkset()
{
sigset_tset;
printf("checksetstart:\n");
if(sigprocmask(0,NULL,&set)<0)
{
printf("checksetsigprocmask error!!\n");
exit(0);
}
if(sigismember(&set,SIGINT))
printf("sigint\n");
if(sigismember(&set,SIGTSTP))
printf("sigtstp\n");
if(sigismember(&set,SIGTERM))
printf("sigterm\n");
printf("checksetend\n");
}
void func()
{
printf("hellofunc\n");
}
查察全套文章:http://www.bianceng.cn/Programming/C/201212/34807.htm