Сегодня рекомендуется использовать sigaction .
Более того, он позволяет вам автоматически сбросить обработчик сигнала до значения по умолчанию до того, как ваш пользовательский обработчик будет вызван в первый раз.
SA_RESETHAND
Если установлено, расположение сигнала должно быть сброшено до SIG_DFL
и
Флаг SA_SIGINFO
сбрасывается при входе в обработчик сигнала.
Примечание:
SIGILL
и SIGTRAP
не могут быть сброшены автоматически при доставке; система
молча применяет это ограничение.
В противном случае расположение сигнала не должно изменяться при входе в
обработчик сигнала.
Кроме того, если этот флаг установлен, sigaction()
может вести себя так, как если бы SA_NODEFER
флаг также был установлен.
Определение обработчика одноразового сигнала
#include <signal.h>
#include <stdio.h>
action.sa_handler = my_handler;
action.sa_flags = SA_RESETHAND;
if (sigaction(SIGINT, &action, NULL) == -1)
{
perror("Failed to install signal handler for SIGINT");
}