信号集 信号阻塞集

信号集相关函数

//信号集
//类型:sigset_t

//sigemptyset(sigset_t *set);
//功能:创建空的信号集
//返回值:成功0,失败-1

//sigismember(sigset_t *set, int num);
//功能:判断信号num是否存在于信号集set
//返回值:存在1,不存在0,失败-1

//sigaddset(sigset_t *set, int num);
//功能:将信号num添加于信号集set
//返回值:成功0,失败-1

//sigdelset(sigset_t *set, int num);
//功能:将信号num删除于信号集set
//返回值:成功0,失败-1

//sigfillset(sigset_t *set);
//功能:创建满的信号集
//返回值:成功0,失败-1

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

int main(int argc, char *argv[])
{
    sigset_t empty_set, fill_set;
    int ret = 0;
    
    ret = sigemptyset(&empty_set);
    if(ret == 0)
        printf("create empty_set success\n");
    ret = sigismember(&empty_set, SIGINT);
    if(ret == 0)
        printf("SIGINT not in empty_set\n");
    ret = sigaddset(&empty_set, SIGINT);
        printf("SIGINT add to empty_set success\n");
    ret = sigismember(&empty_set, SIGINT);
    if(ret == 0)
        printf("SIGINT in empty_set\n");
    ret = sigdelset(&empty_set, SIGINT);
    if(ret == 0)
        printf("SIGINT delete to empty_set success\n");
    ret = sigfillset(&fill_set);
    if(ret == 0)
        printf("create fill_set success\n");
    ret = sigismember(&fill_set, SIGQUIT);
    if(ret == 1)
        printf("SIGQUIT in fill_set\n");

    return 0;
}

执行结果:
在这里插入图片描述

信号阻塞集

//信号阻塞集
//类型:sigset_t
//功能:存在于信号阻塞集的信号,该进程接收到此信号不会响应
//阻塞:该进程暂时不会对此信号进行响应

//sigprocmask(int how, sigset_t *set, sigset_t *oldset);
//how:方式
//1.SIG_BLOCK:将信号集set添加到信号阻塞集中。
//2.SIG_UNBLOCK:将信号集set从信号阻塞集中删除。
//3.SIG_SETMASK:将信号集set设置为信号阻塞集。
//set:信号集
//oldset:旧的信号阻塞集会保存到oleset中,方便恢复,NULL不保存

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

int main(int argc, char *argv[])
{
    sigset_t empty_set, old_set;
    int ret = 0;
    
    ret = sigemptyset(&empty_set);
    if(ret == 0)
        printf("create empty_set success\n");
    
    ret = sigaddset(&empty_set, SIGINT);
        printf("SIGINT add to empty_set success\n");
    ret = sigaddset(&empty_set, SIGQUIT);
        printf("SIGQUIT add to empty_set success\n");
    //将信号集empty_set添加到信号阻塞集中
    sigprocmask(SIG_BLOCK, &empty_set, &old_set);
    for(ret = 0; ret < 5; ret++)
    {
        printf("SIGINT signal is block!\n");
        sleep(1);
    }
    //将信号集empty_set从信号阻塞集中删除
    sigprocmask(SIG_UNBLOCK, &empty_set, NULL);
    for(ret = 0; ret < 5; ret++)
    {
        printf("SIGINT signal is not block!\n");
        sleep(1);
    }
    //将信号集empty_set设置为信号阻塞集
    sigprocmask(SIG_SETMASK, &empty_set, NULL);
    for(ret = 0; ret < 5; ret++)
    {
        printf("SIGINT signal is block!\n");
        sleep(1);
    }

    return 0;
}

执行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值