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