«Безопасно» завершить работающую программу C ++ при нажатии клавиш? - PullRequest
5 голосов
/ 19 марта 2012

Я пытаюсь написать симуляцию, которая будет продолжаться, пока я не нажму определенную клавишу (например, «q» для выхода).Затем, после того, как я нажму это, я хочу, чтобы программа закончила запись данных, которые она записывает в данный момент, закрыла файлы, а затем аккуратно вышла (в отличие от простого нажатия ctrl + c, чтобы заставить программу остановиться).Есть ли способ сделать это на C ++?

Спасибо

1 Ответ

5 голосов
/ 20 марта 2012

Пользователь должен нажать CTRL - C , но установить обработчик сигнала, чтобы справиться с ним.В обработчике сигнала установите глобальную логическую переменную, например user_wants_to_quit.Тогда ваш цикл симуляции может выглядеть следующим образом:

while ( work_to_be_done && !user_wants_to_quit) {
 …
}
// Loop exited, clean up my data

Полная программа POSIX (извините, если вы надеялись на Microsoft Windows), включая установку и восстановление SIGINT ( CTRL - C ) обработчик:

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

namespace {
  sig_atomic_t user_wants_to_quit = 0;

  void signal_handler(int) {
    user_wants_to_quit = 1;
  }
}

int main () {

  // Install signal handler
  struct sigaction act;
  struct sigaction oldact;
  act.sa_handler = signal_handler;
  sigemptyset(&act.sa_mask);
  act.sa_flags = 0;
  sigaction(SIGINT, &act, &oldact);


  // Run the sim loop
  int sim_loop_counter = 3;
  while( (sim_loop_counter--) && !user_wants_to_quit) {
    std::cout << "Running sim step " << sim_loop_counter << std::endl;

    // Sim logic goes here. I'll substitute a sleep() for the actual
    // sim logic
    sleep(1);

    std::cout << "Step #" << sim_loop_counter << " is now complete." << std::endl;
  }

  // Restore old signal handler [optional]
  sigaction(SIGINT, &oldact, 0);

  if( user_wants_to_quit ) {
    std::cout << "SIM aborted\n"; 
  } else {
    std::cout << "SIM complete\n";
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...