Установка реакции на сигнал через функцию signal() не до конца стандартизована и сохраняется для совместимости с историческими версиями Unix. Не рекомендуется к использованию. В стандарте POSIX signal() заменен на вызов sigaction(), сохраняющий для совместимости эмуляцию поведения signal().
signal(SIGINT,sighandler);
sighandler - адрес функции обработчика void sighandler(int)
или один из двух макросов: SIG_DFL (обработчик по умолчанию) или SIG_IGN (игнорирование сигнала).
signal(...)
возвращает предыдущее значение обработчика или SIG_ERR в случае ошибки.
В Linux и SysV при вызове sighandler обработчик сбрасывается в SIG_DFL и возможна доставка нового сигнала во время работы sighandler
. Такое поведение заставляет первой строкой в sighandler
восстанавливать себя в качестве обработчика сигнала, и, даже в этом случае, не гарантирует от вызова обработчика по умолчанию. В BSD системах сброс не происходит, доставка новых сигнала блокируется до выхода из sighandler
.
Пример кода:
#include <signal.h>
void sighandler(int signum) {
signal(signum,sighandler);
...
}
main() {
signal(SIGINT,sighandler);
signal(SIUSR1,SIG_IGN);
signal(SIUSR2,SIG_DFL);
}