Я генерирую сигнал и сталкиваюсь со странным поведением

Я начал получать сигналы в 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 явно разрешает это изменение); не используйте его для этой цели.

Другие вопросы по тегам