【linux随记】信号屏蔽集

屏蔽信号集

作用:屏蔽某些信号—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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值