Почему 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.
Если вызов обработчика вызвал блокировку сигнала, то
сигнал разблокируется по возвращении из обработчика. 
Другие вопросы по тегам