Перехват сигнала блокирует ввод Си

Вот так перехватываю 3 разных сигнала, но после этого блокируется ввод. Как исправить?


    void sig_handler(int signum) {
        sleep(1);
    }

    void catch_signal() {
        signal(SIGINT, sig_handler);
        signal(SIGQUIT, sig_handler);
        signal(SIGTSTP, sig_handler);
    }


Ответы (1 шт):

Автор решения: AlexGlebe

После получения сигнала, второй сигнал будет блокироваться до завершения обработчиком или функция обработки может возвращаться на предыдущие установки. И если обработчик не среагирует быстро следующий сигнал будет обрабатываться по-умолчанию.

man 2 signal

If the disposition is set to a function, then first either the disposition is reset to SIG_DFL, or the signal is blocked (see Portability below), and then handler is called with argument signum. If invocation of the handler caused the signal to be blocked, then the signal is unblocked upon return from the handler.

Может помочь быстрое возвращение обработчиков сигнала на свои места.

void sig_handler(int signum) {
  signal(signum, sig_handler);
  sleep(1);
  fprintf(stderr,"signum = %d\n",signum);
}
→ Ссылка