Ctrl + C シグナルと Ctrl + Break シグナル

Ctrl+CCtrl+Break のキーの組み合わせは、コンソール プロセスによって特別な処理を受けます。 既定では、コンソール ウィンドウにキーボード フォーカスがある場合、Ctrl+C または Ctrl+Break は、キーボード入力としてではなくシグナル (SIGINT または SIGBREAK) として扱われます。 既定では、これらのシグナルは、コンソールにアタッチされているすべてのコンソール プロセスに渡されます (デタッチされたプロセスは影響を受けません。「コンソールの作成」を参照してください)。システムによって、各クライアント プロセスにイベントを処理するための新しいスレッドが作成されます。 プロセスがデバッグされている場合、このスレッドによって例外が発生します。 デバッガーでは、例外を処理するか、例外を未処理のまま続行できます。

Ctrl+Break は常にシグナルとして扱われますが、アプリケーションでは、2 つの方法で既定の Ctrl+C 動作を変更して、ハンドラー関数が呼び出されないようにすることができます。

  • SetConsoleMode 関数を使用すると、コンソールの入力バッファーの ENABLE_PROCESSED_INPUT 入力モードを無効にできます。そのため、Ctrl + C は、シグナルではなくキーボード入力として報告されます。
  • SetConsoleCtrlHandler をパラメーターに NULL 値と TRUE 値を指定して呼び出すと、呼び出し元プロセスで Ctrl + C シグナルが無視されます。 通常の Ctrl + C の処理は、SetConsoleCtrlHandlerNULL 値と FALSE 値を指定して呼び出すことで復元されます。 この Ctrl + C シグナルを無視するか無視しないかという属性は、子プロセスに継承されますが、既存のプロセスに影響を与えることなく、任意のプロセスによって有効または無効にすることができます。

タイムアウトなど、これらのシグナルの処理方法の詳細については、ハンドラー ルーチン コールバックのドキュメントを参照してください。