信号-(2)

信号集
- 信号的集合,多个信号放入信号集。
sigset_t -> 一个超大的整数(128字节)
关于集合的函数:
增加信号 - sigaddset()
删除信号 - sigdelset()
查询信号 - sigismember()
清空信号集 - sigemptyset()
填满信号集 - sigfillset()
有信号就是对应二进制位 置1
无信号就是对应二进制位 置0
位与 用来置0,位或 用来置1,位异或 取反

例子:
#include <stdio.h>
#include <signal.h>

int main(){
  printf("size=%d ",sizeof(sigset_t));
  sigset_t set;
  printf("set=%d ",set);
  sigemptyset(&set);
  printf("set=%d ",set);//0
  sigaddset(&set,2);//把倒数第二位置1
  sigaddset(&set,3);
  printf("set=%d ",set);//2+4 = 6
  sigaddset(&set,7);
  printf("set=%d ",set);//2+4+64 = 70
  sigdelset(&set,3);
  printf("set=%d ",set);//2+64 = 66
  if(sigismember(&set,2))

  {
    printf("signal num 2 is exist ");
  }
}

[root@aiyq195 day08]# ./sigset
size=128

set=-1085854584
set=0
set=6
set=70
set=66
signal num 2 is exist

信号屏蔽
- 执行关键代码时,不希望代码被信号打断,可以使用信号屏蔽防止信号打断程序。信号屏蔽不是没有信号到来,而是信号来了暂时不处理,等解除了屏蔽以后再处理。

信号屏蔽和信号集结合使用,
函数:sigprocmask() 用于信号屏蔽。
int sigprocmask(int how,sigset_t* new, sigset_t* old);
参数how有三个值:
SIG_BLOCK: 相当于加法 原有的 + new的
A B C + C D E -> A B C D E
SIG_UNBLOCK: 相当于减法 原有的 - new的
A B C - C D E -> A B
SIG_SETMASK: 相当于赋值 直接等于new的
A B C C D E -> C D E (最常用)

new是需要屏蔽的信号(传入参数)
old是以前屏蔽的信号(传出参数),如果以前屏蔽的信号不需要保留,给NULL即可。
例子:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>

void fa(int signo){
printf("get the singal %d ",signo);
}
int main(){
signal(SIGINT,fa); signal(SIGQUIT,fa);//不可靠信号
signal(40,fa);//可靠信号
printf("pid=%d ",getpid());
printf("The e word is coming and signal not mask ");
sleep(10);//只要来一个信号,休眠就结束
printf("the word is f ,the singal is mask ");
sigset_t new,old;
sigemptyset(&new);
sigaddset(&new,2); sigaddset(&new,3);
sigaddset(&new,40);
sigprocmask(SIG_SETMASK,&new,&old);//信号屏蔽
sleep(20);
printf("get the mask time singal ");
sigset_t set;
sigpending(&set);//获取了信号屏蔽期间来过的信号
if(sigismember(&set,2)) printf("singal 2 is coming ");
if(sigismember(&set,3)) printf("singal 3 is coming ");
printf("the word f is over,the singal mask over ");
sigprocmask(SIG_SETMASK,&old,NULL);//解除屏蔽
}

[root@aiyq195 day08]# ./sigmask1
pid=13778
The e word is coming and signal not mask
the word is f ,the singal is mask
get the mask time singal
the word f is over,the singal mask over

例子:

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>

void fa(int signo){
printf("get the signo %d ",signo);
}
int main(){
signal(SIGINT,fa); signal(SIGQUIT,fa);//不可靠信号
signal(40,fa);//可靠信号
printf("pid=%d ",getpid());
printf("the word a is start,the singal is not mask ");
sleep(10);//只要来一个信号,休眠就结束
printf("the word b is start,the singal is not mask ");
sigset_t new,old;
sigemptyset(&new);
sigaddset(&new,2); sigaddset(&new,3);
sigaddset(&new,40);
sigprocmask(SIG_SETMASK,&new,&old);//信号屏蔽
sleep(20);
printf("get the mask signo ");
sigset_t set;
sigpending(&set);//获取了信号屏蔽期间来过的信号
if(sigismember(&set,2)) printf("singal 2 come ");
if(sigismember(&set,3)) printf("singal 3 come ");
printf("the word b is over,the mask is over ");
sigprocmask(SIG_SETMASK,&old,NULL);//解除屏蔽
}



原文地址:https://www.cnblogs.com/aiyq195/p/6428658.html