3

さて、私はかなり重い分析を行っているプログラムを書いています。すぐに停止できるようにしたいと思います。

main の先頭に追加signal(SIGINT, terminate);し、次のように終了を定義しました。

void terminate(int param){
   cout << endl << endl << "Exit [N]ow, or [A]fter this url?" << endl;
   std::string answer;
   cin >> answer;
   if(answer[0] == 'n' || answer[0] == 'N'){
      terminateParser();
      exit(1);
   }else if(answer[0] == 'a' || answer[0] == 'A'){
      quitAfterUrl = true;
   }
}

Linux では、これは期待どおりに機能しました。つまり、ユーザーの入力を待ちました。しかし、Windowsで同じことをしようとすると、メッセージが表示され、とにかく終了します。

SIGINT がプログラムをすぐに閉じないようにする方法はありますか?

アップデート:

私が試したとき

BOOL WINAPI handler(DWORD dwCtrlType)
{
  if (CTRL_C_EVENT == dwCtrlType)
  {
    // ask the user
  }
  return FALSE;
}

Gregory が示唆したように、プログラムはユーザー入力を停止せずに不意に終了しました。

更新 2: 何が原因か正確にはわかりませんが、コードは現在機能しています。助けてくれてありがとう。

4

1 に答える 1

8

MSDN から:

SIGINT は、Windows 98/Me および Windows NT/2000/XP を含む Win32 アプリケーションではサポートされていません。CTRL+C 割り込みが発生すると、Win32 オペレーティング システムは、その割り込みを特別に処理するための新しいスレッドを生成します。これにより、UNIX などのシングルスレッド アプリケーションがマルチスレッドになり、予期しない動作が発生する可能性があります。

つまり、前処理ディレクティブを使用し、Windows 固有のソリューションを実装する必要があります。

BOOL WINAPI handler(DWORD dwCtrlType)
{
  if (CTRL_C_EVENT == dwCtrlType)
  {
    // ask the user
  }
  return FALSE;
}

mainそして、あなたの初めに

SetConsoleCtrlHandler(handler, TRUE);
于 2010-01-09T00:33:54.837 に答える