Linux C/C++信号5

35 篇文章 0 订阅
35 篇文章 0 订阅


一、sigprocmask函数和sigpending函数

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

调用函数sigprocmask可以检测或更改(或两者)进程的信号屏蔽字。
参数
how:如何对内核阻塞信号集进行处理

SIG_BLOC :该该进程新的信号屏蔽字是其当前信号屏蔽字和 set指向信号集的并集。set包含了我们希望阻塞的附加信号。
SIG_UNBLOCK:该进程新的信号屏蔽字是其当前信号屏蔽字和 set所指向信号集的交集。set包含了我们希望解除阻塞的信号。
SIG_SETMASK:该该进程新的信号屏蔽是s e t指向的值

set:以及初始化好的用户自定义的信号集
oldset:保存设置之前的内核在的阻塞信号集的状态,可以是 NULL
返回值
成功: 0
失败: -1 ,设置错误号EFAULTEINVAL

int sigpending(sigset_t *set);
        -功能:获取内核中的未决信号集
        -参数:set,传出参数,保存的是内核中的未决信号集中的信息

二、代码示例

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

int main()
{
    //设置2、3号信号阻塞
    sigset_t set;
    sigemptyset(&set);

    //将2号和3号信号添加到信号集中
    sigaddset(&set,SIGINT);
    sigaddset(&set,SIGQUIT);

    //修改内核中的阻塞信号集
    sigprocmask(SIG_BLOCK,&set,NULL);

    int num=0;

    while(1)
    {//获取当前未决信号集的数据
        num++;
        sigset_t pendingset;
        sigemptyset(&pendingset);
        sigpending(&pendingset);

        //遍历前32
        for(int i=1;i<=31;i++)
        {
            if(sigismember(&pendingset,i)==1)
            {
                printf("1");
            }else if(sigismember(&pendingset,i)==0)
            {
                printf("0");
            }
            else
            {
                perror("sigismermber");
                exit(0);
            }
        }

        printf("\n");
        sleep(1);
        if(num==10)
        {//解除阻塞
            sigprocmask(SIG_UNBLOCK,&set,NULL);
        }
    }


    return 0;
}

总结

今天主要给大家介绍了sigprocmask函数和 sigpending函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值