为什么 sigset 包含未添加的 SIGINT?

为什么 sigset 包含未添加的 SIGINT?

编写简单的程序来学习编写 POSIX 风格的信号处理。

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

static void sig_int(int);

int
main(void)
{
    sigset_t    waitmask;

    if (signal(SIGINT, sig_int) == SIG_ERR) {
        printf("error occured\n");
        exit(1);
    }
    sigemptyset(&waitmask);
    sigaddset(&waitmask, SIGUSR1);
    if (sigsuspend(&waitmask) != -1) {
        printf("error\n");
        exit(1);
    }
}

static void
sig_int(int signo)
{
    sigset_t sigset;
    sigprocmask(0, NULL, &sigset);
    if (sigismember(&sigset, SIGINT))
        printf("SIGINT\n");
    if (sigismember(&sigset, SIGUSR1))
        printf("SIGUSR1\n");
}
  1. 我创建了空信号集。

  2. 然后我将 SIGUSR 添加到信号集中。

  3. 安装信号处理程序

  4. 当我启动程序并且它暂停等待信号时,我生成 SIGINT,处理程序打印 SIGINT 也是 sigset 的成员,这似乎是非常奇怪的行为。

为什么 sigismember 认为 SIGINT 是 sigset 的成员,尽管它没有用 sigaddset(&waitmask, SIGINT) 明确添加

答案1

man 2 signal

如果配置设置为函数,那么首先
处置被重置为 SIG_DFL,或者  信号被阻挡  (看
可移植性如下),然后调用处理程序带有参数 signum。
如果处理程序的调用导致信号被阻塞,那么
信号从处理程序返回后即解除阻塞。

相关内容