Linux c之 信号屏蔽字sigprocmask()

出处:http://blog.163.com/shaoyi1110@126/blog/static/7432840120124852546380/

 

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);


函数说明
  一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。sigprocmask()可以用来检测或改变目前的信号屏蔽字,其操作依参数how来决定,如果参数oldset不是NULL指针,那么目前的信号屏蔽字会由此指针返回。每个进程都有一个用来描述哪些信号递送到进程时将被阻塞的信号集,该信号集中的所有信号在递送到进程后都将被阻塞。
  参数how:
  
SIG_BLOCK 该进程新的信号屏蔽字是其当前信号屏蔽字和set指向信号集的并集。set包含了我 
们希望阻塞的附加信号。
SIG_UNBLOCK 该进程新的信号屏蔽字是其当前信号屏蔽字和set所指向信号集的交集。set包含了 
我们希望解除阻塞的信号.
SIG_SETMASK 该进程新的信号屏蔽是set指向的值
 如果set是个空指针,则不改变该进程的信号屏蔽字,how的值也无意义。

返回值

  执行成功返回0,失败返回-1。

错误代码

  
EFAULT 参数set,oldset指针地址无法存取
EINTR 此调用被中断 

范例

  #include <stdio.h>
  #include <signal.h>
  main()
  {
  sigset_t *set;
  set=(sigset_t*)malloc(sizeof(set));
  sigemptyset(set);
  sigaddset(set,SIGINT);
  sigprocmask(SIG_SETMASK,set,NULL);
  while(1);
  return 0;
   


sigprocmask示例(演示添加信号掩码):

  1. #include <stdio.h>  
  2. #include <signal.h>  
  3. void checkset();  
  4.   
  5. void main()  
  6. {  
  7.      sigset_tblockset;  
  8.      sigemptyset(&blockset);  
  9.      sigaddset(&blockset,SIGINT);  
  10.      sigaddset(&blockset,SIGTSTP);  
  11.   
  12.      checkset();  
  13.   
  14.      sigprocmask(SIG_SETMASK,&blockset,NULL);  
  15.      checkset();  
  16.   
  17.      sigaddset(&blockset,SIGTERM);  
  18.      sigprocmask(SIG_BLOCK,&blockset,NULL);  
  19.      checkset();  
  20.   
  21.      sigdelset(&blockset,SIGTERM);  
  22.      sigprocmask(SIG_UNBLOCK,&blockset,NULL);  
  23.      checkset();  
  24. }  
  25.   
  26. void checkset()  
  27. {  
  28.   
  29.      sigset_tset set;  
  30.      printf("checksetstart:\n");  
  31.   
  32.      if(sigprocmask(0,NULL,&set)<0)  
  33.      {  
  34.      printf("checksetsigprocmask error!!\n");  
  35.      exit(0);  
  36.      }  
  37.   
  38.      if(sigismember(&set,SIGINT))  
  39.      printf("sigint\n");  
  40.      if(sigismember(&set,SIGTSTP))  
  41.      printf("sigtstp\n");  
  42.   
  43.      if(sigismember(&set,SIGTERM))  
  44.      printf("sigterm\n");  
  45.       printf("checksetend\n");  
  46. }  



sigprocmask示例(演示添某部分代码不被信号打搅):

 

  1. #include <stdio.h>  
  2. #include <signal.h>  
  3. void checkset();  
  4.   
  5. void func();  
  6. void main()  
  7. {  
  8.      sigset_tblockset,oldblockset,pendmask;  
  9.      printf("pid:%ld\n",(long)getpid());  
  10.   
  11.      signal(SIGINT,func); //信号量捕捉函数,捕捉到SIGINT,跳转到函数指针func处执行  
  12.   
  13.     sigemptyset(&blockset); //初始化信号量集  
  14.     sigaddset(&blockset,SIGTSTP); //将SIGTSTP添加到信号量集中  
  15.     sigaddset(&blockset,SIGINT);//将SIGINT添加到信号量集中  
  16.   
  17.    sigprocmask(SIG_SETMASK,&blockset,&oldblockset); //将blockset中的SIGINT,SIGTSTP阻塞掉,并保存当前信号屏蔽字  
  18.   
  19.      /*执行以下程序时,不会被信号打搅*/  
  20.     checkset();  
  21.     sleep(5);  
  22.      sigpending(&pendmask); //检查信号是悬而未决的  
  23.      if(sigismember(&pendmask,SIGINT)) //SIGINT是悬而未决的。所谓悬而未决,是指SIGQUIT被阻塞还没有被处理  
  24.          printf("SIGINTpending\n");  
  25.   
  26.      /*免打搅结束*/  
  27.   
  28.      sigprocmask(SIG_SETMASK,&oldblockset,NULL); //恢复被屏蔽的信号SIGINT SIGTSTP  
  29.      printf("SIGINTunblocked\n");  
  30.      sleep(6);  
  31. }  
  32.   
  33. void checkset()  
  34. {  
  35.      sigset_tset;  
  36.      printf("checksetstart:\n");  
  37.      if(sigprocmask(0,NULL,&set)<0)  
  38.      {  
  39.      printf("checksetsigprocmask error!!\n");  
  40.      exit(0);  
  41.      }  
  42.      if(sigismember(&set,SIGINT))  
  43.      printf("sigint\n");  
  44.   
  45.      if(sigismember(&set,SIGTSTP))  
  46.      printf("sigtstp\n");  
  47.   
  48.      if(sigismember(&set,SIGTERM))  
  49.      printf("sigterm\n");  
  50.   
  51.      printf("checksetend\n");  
  52.   
  53. }  
  54. void func()  
  55. {  
  56.      printf("hellofunc\n");  
  57. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值