标签:
作者:muge0913
链接: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); 
 
-   
 
-     sigemptyset(&blockset); 
 
-     sigaddset(&blockset,SIGTSTP); 
 
-     sigaddset(&blockset,SIGINT);
 
-   
 
-    sigprocmask(SIG_SETMASK,&blockset,&oldblockset); 
 
-   
 
-      
 
-     checkset();  
 
-     sleep(5);  
 
-      sigpending(&pendmask); 
 
-      if(sigismember(&pendmask,SIGINT)) 
 
-          printf("SIGINTpending\n");  
 
-   
 
-      
 
-   
 
-      sigprocmask(SIG_SETMASK,&oldblockset,NULL); 
 
-      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");  
 
- }  
 
 
 
转载--sigprocmask阻塞进程
标签:
原文地址:http://www.cnblogs.com/flyingdirt/p/4262554.html