屏蔽信号集
作用:屏蔽某些信号—64位位图 对应64种信号,系统捕捉到某种信号时,会先去访问屏蔽信号集,若信号未被屏蔽,则马上处理;若被屏蔽,则将信号挂载到未处理信号集,待到解除屏蔽,系统去未处理信号集取出信号处理
设置屏蔽信号集的方式
- 手动:调用信号集相关API函数
- 自动 :信号处理函数较长时,系统捕捉到很多相同的信号,来不及处理,那么就先把未处理的信号,放到未处理信号集,等信号处理完后,才去未处理信号集取出信号来处理
未处理信号集
倍号如果披屏藏,则记录在未处理信号集中
信号分类
- 非实时信号(1-31),在未处理信号集中不排队,只留一个
- 实时信号(34-64),在未处理信号集中排队,保留全部
非实时信号
#include<stdio.h>
#include<signal.h>
#include <unistd.h>
#include<stdlib.h>
#include <sys/types.h>
void my_func(int sig)
{
if(sig == SIGINT)
{
printf("hello\r\n");
sleep(5);
printnf("world\r\n");
}
}
int main()
{
signal(SIGINT,my_func);//ctrl+c 信号 非实时信号
while(1);
return 0;
}
实时信号
#include<stdio.h>
#include<signal.h>
#include <unistd.h>
#include<stdlib.h>
#include <sys/types.h>
void my_func(int sig)
{
if(sig == 35)
{
printf("hello\r\n");
sleep(2);
printf("world\r\n");
}
}
int main()
{
signal(35,my_func);//35号信号,实时信号
while(1);
return 0;
}
结果:
信号集处理函数
信号集相关API
- int sigemptyset(slgset_t *set): 将信号集合初始化为0
- int sigfillset(sigset _t *set); 将信号集合初始化为1
- int sigaddset(sjgset t *set.int signum): 倍号集合某一位设置为1
- int sigdelset(sigset t *set,int signum); 将倍号集合某一位设費为0
- int sigprocmask(int how,const sigset_t *set,sigset_t *oldset)
- 使用设置好的信号集去修改信号屏蔽集
- 參数how:
- SIG.BLOCK:屏蔽菜个信号(屏蔽集 |set)
- SIG_UNBLOCK打开某个信号(屏蔽集 &(~set))
- SIG_SETMASK:屏蔽集 = set
- 参数oldset:保存旧的屏蔽集的值,NULL表示不保存
#include<stdio.h>
#include<signal.h>
#include <unistd.h>
#include<stdlib.h>
#include <sys/types.h>
void my_func(int sig)
{
sigset_t set;//定义信号集合
sigemptyset(&set);//将信号集合清0
sigaddset(&set,SIGINT);//将信号集合的SIGINT对应的位置1,即打开排队功能
sigprocmask(SIG_UNBLOCK,&set,NULL);//使用设置好的信号集合去修改信号屏蔽集
if(sig == SIGINT)
{
printf("hello\r\n");
sleep(2);
printf("world\r\n");
}
}
int main()
{
signal(SIGINT,my_func);
while(1);
return 0;
}