2009-03-30 51 views
21

私はこの質問にすべてが言いますが、誰かがC++コンソールアプリケーションを閉じるとどうなりますか?のように、上部の角にある「x」をクリックします。それは即座に閉じますか?それは何らかの例外を投げますか?それは未定義の動作ですか?C++コンソールアプリケーションを終了するとどうなるのですか?

+1

どのプラットフォームに興味がありますか? Windows? Linux?それは本当に答えに影響します。 –

+0

「console app」というフレーズを使用すると、文字モードアプリのMS用語のように、ウィンドウが暗示されます。 – AndrewR

答えて

19

上隅にある「X」でC++コンソールアプリケーションを閉じるには、あなたがSetConsoleCtrlHandler機能を使用してコントロールハンドラを設定した場合、あなたがキャッチして処理できCTRL_CLOSE_EVENTスローします。ここでは、閉じる機能を無効にして、実行したいことを実行して、オプションで引き続きデフォルトの動作を実行できます。

+0

コンソールの終了を上書きすることはできません。 'TRUE'か' FALSE'を返しても、プロセスは終了します。代わりに返信するか、返品する場合は、クリーンアップを行うには、プロセスが終了する前にデフォルトで5秒間与えられます。手動で 'AllocConsole'や' AttachConsole'を呼び出しても同じですが、ハンドラで 'FreeConsole'を呼び出すのは遅すぎます。コンソールを閉じるユーザーがメインプロセスを終了してはならない場合は、コンソール用に子プロセスを使用し、標準I/Oをパイプに接続する必要があります。 – eryksun

8

、コンソールが別のプロセスとして実行されます。シェルを閉じると、バックグラウンドで実行されていない現在アクティブなプロセスにSIGHUPシグナルが送信されます。プログラマーがそれを処理しない場合、プロセスは単に終了します。ターミナルとアクティブプロセスでSSHセッションを閉じると、同じシグナルが送信されます。

3

SIGBREAKはWindowsで発生します。

+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 – DLeh

+1

もちろんです。私がこのページを見つけたときに私が欲しかったのは答えです。 – slater

+0

'SIGBREAK'は、Cランタイムを使用している場合にのみ生成されます。 Windows自体にはUnix信号がありません。 Cランタイムには 'CTRL_C_EVENT'を' SIGINT'にマップし、他のすべてのコントロールイベントを 'SIGBREAK'にマップするコンソール制御ハンドラがあります。 – eryksun

関連する問題