Почему 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");
}
Я создаю пустой набор сигналов.
Затем я добавляю SIGUSR в сигсет.
Установите обработчик сигнала
Когда я запускаю программу и она приостанавливает ожидание сигнала, я генерирую SIGINT, обработчик печатает, что SIGINT также является членом sigset, что выглядит очень странно.
Почему sigismember считает, что SIGINT является членом sigset, хотя он не был явно добавлен с sigaddset (& waitmask, SIGINT)?
1 ответ
От man 2 signal:
Если расположение установлено на функцию, то сначала либо расположение сбрасывается до SIG_DFL, или сигнал блокируется (см. Переносимость ниже), а затем вызывается обработчик с аргументом signum. Если вызов обработчика вызвал блокировку сигнала, то сигнал разблокируется по возвращении из обработчика.