Удаление обработчика сигнала Linux в C

Я использую:

signal(SIGINT, CtrlHandler);

Добавить обработчик события SIGINT. Но как я могу удалить этот обработчик?

Ответ 1

Вот что ты делаешь:

signal(SIGINT, SIG_DFL);

Это сбрасывает обработчик сигнала обратно на то, что было по умолчанию для этого сигнала (включая расположение по умолчанию, если оно не было установлено). В случае SIGINT он прерывает ваш процесс без основного дампа.

Руководство для signal объясняет, почему это работает:

signal(signum, handler) задает расположение сигнала signum к handler, который является либо SIG_IGN, SIG_DFL, или адрес программиста определенных функций (а "обработчик сигнала").... Если для параметра установлено значение SIG_DFL, то происходит действие по умолчанию, связанное с сигналом.

Вы также можете найти эту информацию, используя команду man. Если вы вводите man signal в командной строке и читаете, вы должны это увидеть.

Это очень специфично для случая, когда вы заменили обработчик сигнала по умолчанию системы. В некоторых ситуациях вы должны просто восстановить, что обработчик был там в первую очередь. Если вы посмотрите на определение signal это выглядит так:

sighandler_t signal(int signum, sighandler_t handler);

Таким образом, он возвращает sighandler_t. sighandler_t который он возвращает, представляет собой предыдущее "расположение" сигнала. Таким образом, еще один способ справиться с этим - просто сохранить возвращаемое значение и затем восстановить это значение, когда вы хотите удалить свой собственный обработчик.