7

Console.CancelKeyPressイベントにサブスクライブすることにより、処理するC Ctrl#コンソールアプリケーションを作成しました。Cアプリケーションを実行(デバッグバージョン)したとき、プロセスにはすでに14個のスレッドが作成されていました。を押すと、新しい15番目CtrlCスレッドが作成され、ハンドラーが呼び出されました。sysinternalsのProcessExplorerを使用して、プロセスの状態を表示しました。

Ctrl--Cメッセージがプロセスに配信される方法と、追加のスレッドが作成される方法の内部を知りたいのですが。イベントをサブスクライブしなくても、追加のスレッドが作成され、プロセスが終了すると思います。処理のデフォルトのメカニズムはどのようになっていますかCtrl-Cアプリケーションのセットアップです。

私は.net開発者ですが、Windowsオペレーティングシステムが内部でどのように機能するかを理解したいと思います。上記の質問は、Windowsオペレーティングシステムを学ぶことへの好奇心からのみです。

4

2 に答える 2

3

Windowsがコンソールプログラムに外部イベントを通知する必要がある場合、通知を送信するウィンドウメッセージループがないため、Windowsはターゲットプロセスにスレッドを作成して、定義されているコールバック関数を実行します。CTRL + Cイベントのデフォルトのハンドラーは、を呼び出すだけですが、イベントをExitProcessフックすると、ハンドラー関数を使用しCancelKeyPressてWin32関数が呼び出されます。SetConsoleCtrlHandler

ハンドラー関数のドキュメントでは、その仕組みについて説明しています。

SetConsoleCtrlHandler関数で使用されるアプリケーション定義関数。コンソールプロセスは、この関数を使用して、プロセスが受信した制御信号を処理します。シグナルを受信すると、システムは関数を実行するプロセスに新しいスレッドを作成します。

Windowsがプロセスに挿入するスレッドのスタックはかなり小さいため、CLRハンドラールーチンは実際にはスレッドプールワークアイテムをキューに入れてイベントハンドラーを実行することに注意してください。これは、Windowsによって挿入されたスレッドワーカースレッドの両方が作成される可能性があることを意味し、CTRL+Cイベントの処理中に最大2つの追加スレッドが表示されるようになります。

于 2011-12-04T17:10:00.673 に答える
1

はい、Windows はスレッドを起動して、SetConsoleCtrlHandler()によって登録されたハンドラーを呼び出します。これは、ControlCHooker という小さな内部ヘルパー クラスの Hook() メソッドによって呼び出されます。Cancel.CancelKeyPress イベントの add() アクセサーによって呼び出されます。Windows コールバックにより、イベント ハンドラーが実行されます。

Reflector や ILSpy などの優れた逆アセンブラーと参照ソースは、これらの実装の詳細を発見するのに役立ちます。

于 2011-12-04T16:48:23.453 に答える