Linux信号屏蔽以及挂钩处理

该程序演示了如何在C++中设置SIGINT信号处理器。当接收到SIGINT信号(如Ctrl+C)时,程序会执行特定的处理函数,该函数会在接收到信号后执行一段代码。在此期间,即使有多个SIGINT信号发送给进程,信号处理器也只会额外触发一次。程序使用`signal()`函数注册信号处理器,并通过`sigprocmask()`屏蔽其他信号。

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

//
// Created by w on 2023/3/11.
//

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

using namespace std;

// 在终端中反复对进程发信号SIGINT。理论上进程栈会反复跳转到此处。
// 但如果信号挂钩已经在执行了,不会被新的信号打断,新的信号会堆积。(但是对于同类型的新信号,只会保留最后一条。)
// 即意味着:在信号挂钩函数执行期间,不管收到多少条同类信号。信号挂钩函数最多会被额外再触发一次而已。

void IntProcessor(int nSignal) {
    cout << "receive" << nSignal << endl;
    int sec = 10;
    while (sec-- > 0) {
        sleep(1);
        cout << "signal processing" << endl;
    }
}

void setSigProcessor() {
    //屏蔽除了SIGINT之外的其他信号
    sigset_t sgset;
    sigfillset(&sgset);
    sigdelset(&sgset, SIGINT);
    sigprocmask(SIG_SETMASK, &sgset, nullptr);

    //为SIGINT设置挂钩函数
    signal(SIGINT, IntProcessor);
    cout << "after register signal handler" << endl;
}

int main() {
    cout << "cur pid " << getpid() << endl;
    setSigProcessor();
    while (true) {
        sleep(1);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值