信号屏蔽 sig函数族(sigaddset,sigemptyset等)用法 Linux系统编程

屏蔽系统信号

程序执行后,会循环打印未决信号集000----0000(32位),如果有相应信号输入,如ctrl+c,因为SIGINT被屏蔽,未决信号集中对应3号位置一直置为1(信号被屏蔽,无法被处理,处于未决状态),打印变为001-----0000(32),其他信号类似。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<signal.h>


void printped(sigset_t* ped)
{
    int i;
    for(i=1;i<=32;i++)
    {
        if(sigismember(ped,i)==1)//检查信号是否在信号集中,未决信号
            putchar('1');
        //触发SIGQUIT信号时,因为被屏蔽,所以未决信号集3号位一直为1.
        else
            putchar('0');
    }
    printf("\n");
}
int main(void)
{
    sigset_t myset ,oldset,ped;
    sigemptyset(&myset); //创建自定义集合set
    sigaddset(&myset,SIGQUIT); //把集合中3号位置1,ctrl+\产生SIGQUIT信号
    // sigaddset(&myset,SIGINT); //把集合中2号位置1,ctrl+c产生SIGINT信号
    //sigaddset(&myset,SIGTSTP); //把集合中20号位置1,ctrl+z产生SIGTSTP信号
    sigaddset(&myset,SIGSEGV);    //段错误,kill -11 pid 发送信号
    sigaddset(&myset,SIGKILL);    //杀死程序,老大哥无法屏蔽
    sigprocmask(SIG_BLOCK,&myset,&oldset);//设定myset对应到系统屏蔽字集合
    //此处相当于myset|mask,3号SIGQUIT被屏蔽
    while(1)
    {
        sigpending(&ped);//ped传出参数,保存信号集
        printped(&ped);//打印未决信号集
        sleep(1);
    }
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值