信号集
- 信号的集合,多个信号放入信号集。
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);//解除屏蔽
}