Как сбросить SIGINT на значение по умолчанию после указания какого-то пользовательского обработчика в течение некоторого времени? - PullRequest
6 голосов
/ 05 сентября 2010

Я использую signal(SIGINT,my_handler), чтобы указать SIGINT на my_handler. Через некоторое время я хочу сбросить его на любой обработчик по умолчанию, на который он указывает в целом. Как я могу это сделать?

Ответы [ 2 ]

10 голосов
/ 05 сентября 2010

Передайте SIG_DFL в качестве параметра func на signal() для сброса поведения по умолчанию:

signal(SIGINT, SIG_DFL);
0 голосов
/ 30 января 2019

Сегодня рекомендуется использовать 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...