Я генерирую сигнал и сталкиваюсь со странным поведением
Я начал получать сигналы в Linux, но в моем коде происходит странное поведение. Я только начал и искал это тоже, но я ничего не нашел, извините, если вопрос слишком хромает, вот код:
void Handler(int sig ){
printf("Inside Handler\n");
}
int main(int argc, char * argv[], char * envp[]){
if( signal(SIGINT, Handler) ==SIG_ERR )
exit(EXIT_FAILURE);
for(size_t i = 0; ; i++){
printf("%d\n", i);
sleep(2);
}
}
я знаю printf
, signal
звонки не очень хорошая идея, но я не изучал sigaction
до сих пор. Теперь согласно моей книге и другим учебникам, если я нажму ctrl+c
тогда он должен позвонить Handler
каждый раз, но здесь странная вещь: когда я нажимаю ctrl+c
однажды, это звонит Handler
но в следующий раз это завершает программу. Почему происходит эта странная вещь?
3 ответа
Вот код, который я написал с вашей помощью, который отлично работает, и я верю, что он будет хорошо работать на каждой платформе
#define _GNU_SOURCE
void Handler(int sig ){
printf("Inside Handler\n");
}
int main(int argc, char *argv[], char *envp[] ){
sighandler_t Action =Handler;
if( Action == SIG_DFL ){
Action = Handler;
}
if( signal(SIGINT, Action ) == SIG_ERR )
exit(EXIT_FAILURE );
for(size_t k = 0 ; ; k++ ){
printf("%d\n", k );
sleep(2);
}
}
Страница руководства для signal
системный вызов говорит:
Если сигнал Signum доставлен процессу, то происходит одно из следующего:
Если расположение установлено в SIG_IGN, то сигнал игнорируется.
Если расположение установлено в SIG_DFL, то происходит действие по умолчанию, связанное с сигналом (см. Сигнал (7)).
Если расположение установлено на функцию, то сначала либо расположение сбрасывается на SIG_DFL, либо сигнал блокируется (см. Портативность ниже), а затем вызывается обработчик с аргументом signum. Если вызов обработчика вызвал блокировку сигнала, то сигнал разблокируется при возврате из обработчика.
Поскольку стандартное поведение SIGINT должно завершаться после сброса сигнала к стандартному, последующее поведение отличается.
Поведение signal
когда передан обработчик, отличный от SIG_DFL
или же SIG_IGN
не определено использование sigaction
для этого.
Как говорят в документах:
Единственное портативное использование signal() - установить расположение сигнала в
SIG_DFL
или жеSIG_IGN
, Семантика при использовании signal() для установки обработчика сигнала варьируется в разных системах (и POSIX.1 явно разрешает это изменение); не используйте его для этой цели.