Почему sigset включает не добавленный SIGINT? [closed]

Написал простую программу, чтобы научиться писать обработку сигналов в стиле 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 к sigset.

  3. Установите обработчик сигнала.

  4. Когда я запускаю программу, и она приостанавливает ожидание сигнала, я генерирую SIGINT, обработчик выводит, что SIGINT также является членом sigset, что кажется очень странным поведение.

Почему sigismember считает, что SIGINT является членом sigset, хотя он не был добавлен явно с помощью sigaddset (& waitmask, SIGINT) ?

0
задан 6 January 2017 в 10:54

1 ответ

От man 2 signal :

If  the  disposition  is  set  to  a function, then first either the
disposition is reset to SIG_DFL,  or  the  signal  is  blocked  (see
Portability below), and then handler is called with argument signum.
If invocation of the handler caused the signal to be  blocked,  then
the signal is unblocked upon return from the handler.
2
ответ дан 7 November 2019 в 04:56

Другие вопросы по тегам:

Похожие вопросы: