Windowsで任意の信号を送信しますか?
質問
Linuxは、SIGINT
-Commandを使用して、SIGTERM
やkill
などの任意のPosix-Signalをプロセスに送信することをサポートしています。 SIGQUIT
とkill -3 <VM-PID>
はプロセスを友好的またはあまり友好的でない方法で終了させる退屈な古い方法ですが、Signal
はコアダンプをトリガーすることを意図しています。これを使用して、実行中のすべてのスレッドのスタックトレースを含むスレッドダンプを印刷する実行中のJava VMをトリガーできます。デバッグ情報を出力した後、Java VMは以前に実行していたことをすべて実行し続けます。実際、スレッドダンプは、優先度が最大の別のスレッドで発生します。 (SignalHandler
を使用して、これを自分で試すことができます。)
sun.misc
パッケージの(サポートされていない!)Ctrl-C
およびSIGBREAK
クラスを使用して、独自のシグナルハンドラを登録することもできます。
ただし、Windowsプロセスにシグナルを送信する方法はまだありません。シグナルは特定のユーザー入力によって作成されます。たとえば、両方のプラットフォームで<=>をトリガーします。 。しかし、Windowsで実行中の非対話型プロセスに手動でシグナルを送信するユーティリティはないようです。明らかな解決策は、Cygwin <=>実行可能ファイルを使用することですが、適切なWindows APIを使用してWindowsプロセスを終了できますが、<=>(Windowsの<=>と同等)を送信できませんでした。実際、Windowsプロセスに送信できる唯一の信号は<=>です。
それで、長い話を短くして、見出しを繰り返します:Windowsのプロセスに任意のシグナルを送信するにはどうすればよいですか
解決
別のプログラム/プロセスを明示的/プログラム的に強制終了する場合は、SysInternalsのpstoolsに<!> quot; pskill <!> quotという小さなツールがあります。 Unixen <!> quot; kill <!> quot;と同じように動作します。
何か他のものが必要な場合は、読み続けてください(以下の詳細については間違っているかもしれません-WinAPIとCharles Petzoldの優れた書籍のみを使用してCでWindowsプログラムを最後に開発して以来、何年も経っています<!> quot; Windows向けプログラミング<!> quot;ガイドとして)。
Windowsでは<!> quot; signals <!> quot;が適切にありません。WinMainおよびWinProcがオペレーティングシステムから受け取る機能は、単純なメッセージです。たとえば、<!> quot; X <!> quot;をクリックすると、ウィンドウのボタンを押すと、WindowsはそのウィンドウのハンドラにメッセージWM_CLOSEを送信します。ウィンドウは削除されたが、プログラムはまだ実行中の場合、WM_DESTROYを送信します。メインメッセージ処理ループから抜け出そうとすると、WinMain(WinProcではない)がWM_QUITを受け取ります。プログラムはこれらすべてに期待どおりに応答するはずです-実際に<!> quot; unclosable <!> quot;を開発できます。 WM_CLOSEを受け取ったときにすべきことをしていないアプリケーション。
ユーザーがWindowsタスクマネージャーからタスクを選択して<!> quot; End Task <!> quot;をクリックすると、OSはWM_CLOSE(および覚えていない別のWM_CLOSE)を送信します。 <!> quot; End Process <!> quot;を使用すると、プロセスは直接強制終了され、メッセージは送信されません(ソース:古い新物
別のプロセスのウィンドウのHWNDを取得する方法があったことを覚えています。別のプロセスがPostMessageおよびDispatchMessage関数を介してそのウィンドウにメッセージを送信できるようになったら
他のヒント
WindowsはPOSIXではありません。信号はありません。コンソールプログラムが取得する唯一の「シグナル」は、SetConsoleCtrlHandler
を呼び出した場合のみです。この場合、ユーザーがCtrl + C、Ctrl + Breakを押した、コンソールウィンドウを閉じた、ログオフした、またはシステムをシャットダウンしたことを通知できます。
他のすべては、通常はウィンドウメッセージまたはRPCを使用してIPCで実行されます。 Sunのドキュメントをチェックして、Windows JREで求めていることを実行する方法があるかどうかを確認してください。
Windowsでは、すべてがWin32メッセージを中心に展開します。これを行うコマンドラインツールはないと思いますが、C ++では FindWindow を使用して、任意のメッセージを別のWindowsプログラムに送信します。例:
#define WM_MYMSG ( WM_USER+0x100 )
HWND h = ::FindWindow(NULL,_T("Win32App"));
if (h) {
::PostMessage(h, WM_MYMSG, 0, 0);
}
これは、com interopを使用してC#でも実行できます。
jconsoleを使用して、実行中のすべてのスレッドのスタックトレースを表示することもできます。これは、Windows、およびJavaをサポートする他のOSで動作します。 jconsoleには、他にも多くの便利な機能、メモリグラフ、CPUグラフなどがあります。
元の質問には答えませんが、同じ結果が得られることを願っています。
jconsoleに慣れていない場合は、 JConsoleの使用ドキュメント。
PsTools が今からMicrosoftが所有しており、 SysInternals が役立ちます。
Rubyは、何らかの方法でWindows上でSIGINT SIGKILLなどを(少なくともエミュレート)し、それらのメッセージをトラップできます。ぜひチェックしてみてください。
どのようにrubyが<!> quot;そのプロセスにシグナルSIGINTを送信する<!> quot;その下では、ウィンドウで、実際にそのPIDでTerminateProcess
または同等のものを呼び出します。
<!> quot; ctrl + c <!> quotをキャッチするためのWindows同等のメソッドもあります。それがそこにあるものだと思います。