Linux下C编程:sigprocmask阻塞历程
当前位置:以往代写 > C/C++ 教程 >Linux下C编程:sigprocmask阻塞历程
2019-06-13

Linux下C编程:sigprocmask阻塞历程

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");     
}

Linux下C编程:sigprocmask阻塞过程

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

    关键字:

在线提交作业