Правильный способ ожидания ввода после обработки sigaction ctrl+c aka SIGINT

Эта программа выведет бесконечное "Enter a:" в командную строку после отправки SIGINT через Ctrl + C. Чтобы выйти из этого цикла, я использую Ctrl + \. Если я раскомментирую строку, содержащую std::cin.clear();все работает нормально. У меня вопрос, это правильный способ сделать это? Нужно было бы установить std::cin.clear(); перед каждым cin/cout он хочет, чтобы программа ждала. Вот почему это, кажется, не правильный путь для меня.

#include<iostream>
#include<signal.h>

void sig_handler(int s)
{
  std::cout << "Cought: " << s << std::endl;
  // do something...
}


int main ()
{
  struct sigaction sigIntHandler;
  sigIntHandler.sa_handler = sig_handler;
  sigemptyset(&sigIntHandler.sa_mask);
  sigIntHandler.sa_flags = 0;
  sigaction(SIGINT, &sigIntHandler, NULL);
  int a=1;
  while(a)
    {
      std::cout << "Enter a:" << std::endl;
      //std::cin.clear(); // Uncomment me!
      std::cin >> a;
    }
}

PS: я знаю, что cout в обработчиках сигналов - плохая идея.

PPS: все отлично работает (без std::cin.clear();) когда я использую старый (не рекомендуется) signal(),

PPPS: Просто чтобы прояснить, я не хочу выходить из программы по Ctrl + C!

0 ответов

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