Ваша проблема в том, что sa_handler
и sa_sigaction
поля struct sigaction
на самом деле одно и то же поле . Цитирование справочной страницы (OSX) для sigaction(2)
:
struct sigaction {
union __sigaction_u __sigaction_u; /* signal handler */
sigset_t sa_mask; /* signal mask to apply */
int sa_flags; /* see signal options below */
};
union __sigaction_u {
void (*__sa_handler)(int);
void (*__sa_sigaction)(int, struct __siginfo *,
void *);
};
#define sa_handler __sigaction_u.__sa_handler
#define sa_sigaction __sigaction_u.__sa_sigaction
Таким образом, ваше назначение sa_sigaction
перезаписывает уже установленный вами обработчик. Вы должны просто установить sa_handler
и оставить sa_sigaction
в покое. Вот как CatchIntSignal
следует читать:
void CatchIntSignal()
{
struct sigaction intAction;
intAction.sa_handler = IntHandler;
sigemptyset(&intAction.sa_mask);
intAction.sa_flags = SA_RESTART;
if(sigaction(SIGINT, &intAction, NULL) != 0)
printf("sigaction() failed: %s\n", strerror(errno));
}
(Вам может потребоваться добавить #include из string.h
и errno.h
, чтобы получить бит strerror(errno)
для компиляции. Всегда включайте strerror(errno)
в сообщения об ошибках, возникающие при сбое системных вызовов.)
(ИСПРАВЛЕНИЕ: добавлено SA_RESTART
к флагам за ниндзя).