У меня есть небольшая проблема, которая кажется мне довольно странной. Я написал этот фрагмент кода для обработки сигналов.
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). Спасибо вам большое за ваше время.