SIG_DFL выдает предупреждение при компиляции, игнорируется ОС при выполнении

У меня есть небольшая проблема, которая кажется мне довольно странной. Я написал этот фрагмент кода для обработки сигналов.

void sig_install(wlist *arg)
{
    struct sigaction sigstruct;
    //Doing stuff
    sigstruct.sa_handler = &handlerfunc;
    sigstruct.sa_flags = SA_RESTART;
    sigaction(sig, &sigstruct, NULL)
}

И этот работает очень хорошо. я должен был определить

#define _POSIX_C_SOURCE 200809L

для разрешения флага SA_RESTART (мой профессор сказал мне использовать его). Моя проблема заключается в следующем: я везде читал, что могу использовать SIG_DFL и sigaction для установки обработчика по умолчанию для моего сигнала, например:

void sig_uninstall(wlist *arg)
{
    //Do stuff
    if (sigaction(sig, SIG_DFL, NULL) == 0)
        printf("Signalhandler deleted!\n");
    else
        printf("Signalhandler could not be deleted!\n");
}

но когда я его компилирую, я получаю предупреждение для аргумента SIG_DFL, в котором говорится:

»const struct sigaction * __restrict__« expected, but Argument is type »void (*)(int)«

И когда я выполняю программу, sigaction() возвращает 0 в случае успеха, но мой обработчик сигналов по-прежнему не используется по умолчанию, когда я отправляю сигнал.

Определения в моих заголовках:

#define SIG_DFL ((__sighandler_t) 0)        /* Default action.  */
# define SA_RESTART   0x10000000 /* Restart syscall on signal return.  */
/* Get and/or set the action for signal SIG.  */
extern int sigaction (int __sig, __const struct sigaction *__restrict __act,
          struct sigaction *__restrict __oact) __THROW;

Я прочитал в manb, что SA_RESTART просто используется в BSD. Может в этом проблема? Есть ли альтернативный флаг для Linux? (В университете мы должны использовать BSD, но дома я использую Linux). Спасибо вам большое за ваше время.


person masked_m0nkey    schedule 17.05.2014    source источник


Ответы (1)


Вам нужно установить sa_handler (псевдо) элемент struct sigaction в SIG_DFL, а не сам struct sigaction *.

Или просто используйте signal() вместо этого.

person Potatoswatter    schedule 17.05.2014
comment
Это сделало Работу. Большое спасибо! - person masked_m0nkey; 17.05.2014