Как установить sa_mask в sigset_t? - PullRequest
4 голосов
/ 06 августа 2011

gcc (GCC) 4.6.0 c89

У меня есть обработчик сигнала, объявленный так:

   /* Setup signal handler */
    struct sigaction new_action;
    new_action.sa_handler = g_signal_handler;
    new_action.sa_flags = SA_ONSTACK;

    if(sigaction(SIGINT, &new_action, NULL) == -1) {
        fprintf(stderr, "Failed to setup signal handlers.");
        return -1;
    }

Когда я запускал свой код через valgrind, т.е. valgrind --leak-check=full он обнаружил следующую ошибку:

==5206== Syscall param rt_sigaction(act->sa_mask) points to uninitialised byte(s)
==5206==    at 0x347A435455: __libc_sigaction (in /lib64/libc-2.14.so)

Поэтому, посмотрев справочные страницы, я решил установить вот так, просто чтобы проверить:

new_action.sa_mask = SA_NODEFER;

Однако, это просто дает мне следующую ошибку:

error: incompatible types when assigning to type ‘__sigset_t’ from type ‘int’

Большое спасибо за любые предложения,

1 Ответ

17 голосов
/ 06 августа 2011

Попробуйте это:

/* Signals blocked during the execution of the handler. */
sigemptyset(&new_action.sa_mask);
sigaddset(&new_action.sa_mask, SIGINT);

Поле sa_mask позволяет нам указать набор сигналов, которые не являются разрешено прерывать выполнение этого обработчика. В дополнение автоматически вызывается сигнал, вызвавший вызов обработчика к маске сигналов процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...