2

Control-Cを例外がスローされたように動作させる方法はありますか?つまり、基本的にプログラムは終了しますが、途中ですべてのデストラクタが呼び出されますか?

4

2 に答える 2

1

そうですね、シグナル ハンドラ catch SIGINT が必要です (SIGTERM、HUP も同様ではありませんか?)。このような単純なことにスレッドを使用したくない場合は、標準の「セルフパイプトリック」を使用してください。シグナルハンドラーのソケットペアの一方の端にバイト (シグナル値) を書き込み、メインループ (常にどこかに選択ループがあります) 非同期に値を読み戻します。その時点で、投げたり、逃げたり、通常の終了手順に従い、好きなことをしたりします. メイン アプリケーション ループで他の理由で終了したかのように、すべてが巻き戻されて破壊されます。

于 2012-11-08T11:31:21.170 に答える
0

これは通常、不可能または困難です。GNU/Linux などの一部のシステムでは、GCC にフラグを指定すれば-fnon-call-exceptions -fasynchronous-unwind-tables(未テスト)、それを実行できると思います。

上記以外に、基本的に 2 つのオプションがあります。

  1. シグナルハンドラにある種のフラグを設定して、SIGINT が配信されたかどうかを別の場所で確認します。これは、*NIX プラットフォームと Windows プラットフォームの両方で役立ちます。

  2. *NIX では、アプリケーションで既にスレッドを使用している場合、別のスレッドで同期イベントとしてsigwait()などを使用して SIGINT を処理し、アプリケーション全体を正常に終了させることができます。

2番目のオプションを使用することをお勧めします.2番目のオプションは、Windowsの問題に対する一般的なアプローチとしても使用できます. Windows は、ユーザーが提供した Ctrl-C または Ctrl-Break のハンドルを実行するアプリケーションにスレッドを挿入します。2 番目のオプションを使用すると、アプリケーションの移植性が向上します。

于 2012-11-08T10:45:20.103 に答える