[Linux]信号集和sigprocmask信号屏蔽函数

本文介绍如何使用信号集和信号屏蔽函数来控制进程接收到的信号。通过实例演示了如何屏蔽特定信号(如SIGUSR1),并使进程继续接收其他信号(如SIGUSR2)。文章深入浅出地解释了信号处理的基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

系统提供这样一种能力,就是创建一个信号集,然后传递给信号屏蔽函数,从而屏蔽向该进程发送的信号。

有一点需要注意的是,不能屏蔽SIGKILL和SIGSTOP信号。

信号集是sigset_t类型,是一个屏蔽字,每一位代表一个信号,由下面几个函数初始化和创建。

int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);

屏蔽函数

int sigprocmask(int how, const sigset_t *restrict set, const sigset_t *restrict oset);

二、实例

实例代码中屏蔽了SIGUSR1信号后,任何途径向该进程发送SIGUSR1都不会被接收,SIGUSR2则如常接收。

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

void sig_usr(int signo)
{
    if (signo == SIGUSR1)
        printf("received SIGUSR1\n");
    else if (signo == SIGUSR2)
        printf("received SIGUSR2\n");
    else
        printf("received signal %d\n", signo);
}


int main(void){
    sigset_t s_1;
    sigemptyset(&s_1);
    sigaddset(&s_1, SIGUSR1);
    sigprocmask(SIG_SETMASK, &s_1, NULL);

    signal(SIGUSR1, sig_usr);
    signal(SIGUSR2, sig_usr);

    pause();
    printf("continue.\n");
    return 0;
}

 

转载于:https://www.cnblogs.com/yiyide266/p/10653708.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值