为什么下面的代码无法解锁 SIGINT 信号

为什么下面的代码无法解锁 SIGINT 信号

我正在尝试 Linux Signals。我创建了一个如下场景:

  1. 最初使用 阻止所有SIGINT信号sigprocmask()
  2. 如果发送者发送SIGUSR1信号,则SIGINT在进程生命周期的剩余时间内解除阻塞。

然而,第一步已成功实施,但无法使用 解锁(或更改)进程掩码sigprocmask()

我究竟做错了什么?

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

sigset_t block_list, unblock_list;

void sigint_handler(int sig)
{
        printf("Ouch!!\n");
}

void sigusr1_handler(int sig)
{
        sigemptyset(&unblock_list);
        sigprocmask(SIG_SETMASK, &unblock_list, NULL);
}


int main(int argc, char **argv)
{
    int count;

    signal(SIGINT, &sigint_handler);
    signal(SIGUSR1, &sigusr1_handler);

    sigemptyset(&block_list);
    sigaddset(&block_list, SIGINT);
    sigprocmask(SIG_SETMASK, &block_list, NULL);

    for(count=1; ;++count)
    {
            printf("Process id: %ld\t%d\n", (long)getpid(), count);
            sleep(4);
    }

    exit(EXIT_SUCCESS);
    }

$kill -n SIGINT <pid>

$kill -n SIGUSER1 <pid> //This call should unblock sigint_handler() for rest of the process life, but it is only unblocking for one time. Everytime I have call $kill -n SIGUSER1 <pid> to unblock SIGINT.

注意:为了简单起见,错误处理已被删除。

答案1

从信号处理程序返回后,内核将恢复信号掩码。这是由标准:

当线程的信号掩码在由 所安装的信号捕获函数中更改时sigaction(),从信号捕获函数返回时信号掩码的恢复会覆盖该更改(请参阅sigaction())。如果安装了信号捕获功能signal(),则不确定是否会发生这种情况。

在Linux上,signal(2)只是一个已弃用的兼容包装器sigaction(2),并且在使用时也会发生这种情况signal(2)

相关内容