Не удается установить маску сигнала в обработчике сигналов

У меня небольшая проблема: если я выполняю код, который находится внутри функции-обработчика в основном (вместо вызова kill), маска работает надежно и блокирует SIGINT. Если я попытаюсь добавить маску сигнала к вызову SIGUSR2, как в приведенном ниже коде, маска не маскирует никакие сигналы SIGINT. В чем проблема?

  pid_t parent_pid;
  sigset_t mask;

    int main(void) {
        signal(SIGINT, handleSigint);
        signal(SIGUSR2, handleSigUSR2);
        signal(SIGUSR1, handleSigUSR1);
        sleep(1);
        kill(getpid(), SIGUSR2);
        while (1) {
        }

    }

void handleSigUSR2(int sig) {
    signal(SIGUSR2, handleSigUSR2);
    printf("StartUSR2\n");
    if (sigaddset(&mask, SIGINT) != 0) {
        printf("Error with addset\n");
    }
    if (sigprocmask(SIG_BLOCK, &mask, NULL) != 0) {
        printf("Error with sigprocmask\n");
    }
    printf("EndUSR2\n");

}

person Ihara    schedule 23.04.2015    source источник
comment
sigset_t mask; // не инициализируется   -  person Stian Skjelstad    schedule 19.04.2016


Ответы (1)


изменения, внесенные в sigprocmask, будут отменены, когда обработчик сигнала вернется. Я считаю, что установка sigprocmask внутри обработчика сигнала четко не определена. См. Справочную страницу для rt_sigreturn (2) относительно linux

person Stian Skjelstad    schedule 19.04.2016