簡體   English   中英

“安全地”終止按鍵上正在運行的C ++程序?

[英]“Safely” terminate a running C++ program on keypress?

我正在嘗試編寫一個模擬,它將持續運行,直到我按下某個鍵(例如“ q”表示退出)。 然后,在我按該鍵之后,我希望程序完成其當前正在寫入的數據的寫入,關閉文件,然后正常退出(這與僅按ctrl + c來強制程序停止相反)。 有什么辦法可以在C ++上做到這一點?

謝謝

讓用戶按CTRL - C ,但安裝一個信號處理程序來處理它。 在信號處理程序中,設置一個全局布爾變量,例如user_wants_to_quit 然后,您的sim循環如下所示:

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";
  }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM