35

Linux は、 -Commandを使用して、SIGINTまたはなどの任意の Posix シグナルをプロセスに送信することをサポートしています。とは、友好的またはあまり友好的でない方法でプロセスを終了するための退屈な古い方法ですが、コアダンプをトリガーすることを目的としています。これを使用して、実行中の Java VM をトリガーして、実行中のすべてのスレッドのスタック トレースを含むスレッド ダンプを出力できます。デバッグ情報を出力した後、Java VM はそれまで行っていた処理を続行します。実際、スレッド ダンプは、最高優先度の別の生成されたスレッドで発生します。( を使用して、これを自分で試すことができます。)SIGTERMkillSIGINTSIGTERMSIGQUITkill -3 <VM-PID>

Signal(サポートされていません!)および-packageSignalHandlerのクラスを使用して、独自のシグナル ハンドラーを登録することもsun.miscできるので、さまざまな楽しみ方ができます。

ただし、Windows プロセスにシグナルを送信する方法をまだ見つけていません。シグナルは、特定のユーザー入力によって作成されます。たとえば、両方のプラットフォームでCtrl-Ca をトリガーします。SIGINTしかし、Windows で実行中の非対話型プロセスにシグナルを手動で送信するユーティリティはないようです。明らかな解決策は、Cygwinkill実行可能ファイルを使用することですが、適切な Windows API を使用して Windows プロセスを終了することはできますが、SIGBREAK(Windows で に相当するSIGQUIT) を一緒に送信することはできませんでした。実際、Windowsプロセスに送信できる唯一のシグナルはSIGTERM.

長い話を短くして、見出しを繰り返します: Windows のプロセスに任意のシグナルを送信するにはどうすればよいですか?

4

7 に答える 7

17

任意の種類の別のプログラム/プロセスを明示的/プログラム的に強制終了したい場合は、SysInternals の pstools 内に、Unixen の「kill」と同じように動作する「pskill」という名前の小さなツールがあります。

何か他のものが必要な場合は、読み続けてください (ただし、以下の詳細のいくつかについては間違っている可能性があります。WinAPI と Charles Petzold の優れた本「Programming for Windows」をガイドとして使用して、C で Windows プログラムを最後に開発してから何年も経っています)。 )。

Windows では、「シグナル」が正しくありません。WinMain と WinProc がオペレーティング システムから受け取る機能は単純なメッセージです。たとえば、ウィンドウの「X」ボタンをクリックすると、Windows はそのウィンドウのハンドラにメッセージ WM_CLOSE を送信します。ウィンドウが削除されてもプログラムがまだ実行されている場合、WM_DESTROY が送信されます。メイン メッセージ処理ループから抜けようとしているときに、WinMain (WinProc ではない) が WM_QUIT を受け取ります。あなたのプログラムは、期待通りにこれらすべてに応答する必要があります。実際には、WM_CLOSE を受け取ったときにすべきことを行わないことで、「閉じられない」アプリケーションを開発できます。

ユーザーが Windows タスク マネージャーからタスクを選択して [タスクの終了] をクリックすると、OS は WM_CLOSE (および覚えていない別のメッセージ) を送信します。ただし、「プロセスの終了」を使用すると、プロセスは直接強制終了され、メッセージは送信されません (出典: The Old New Thing

別のプロセスが関数 PostMessage および DispatchMessage を介してそのウィンドウにメッセージを送信できることがわかったら、別のプロセスのウィンドウの HWND を取得する方法があったことを覚えています。

于 2008-09-26T15:58:44.030 に答える
9

Windows は POSIX ではありません。信号はありません。コンソール プログラムが受け取る唯一の「シグナル」は、 を呼び出しSetConsoleCtrlHandlerた場合です。この場合、ユーザーが Ctrl+C、Ctrl+Break を押した、コンソール ウィンドウを閉じた、ログオフした、またはシステムをシャットダウンしたことを通知できます。

それ以外はすべて IPC で行われ、通常はウィンドウ メッセージまたは RPC で行われます。Sun のドキュメントを調べて、Windows JRE で求めていることを実行する方法があるかどうかを確認してください。

于 2008-09-26T15:20:44.277 に答える
4

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 相互運用機能を使用して C# でも実行できます。

于 2008-09-26T15:29:24.630 に答える
2

SIGINT およびその他のシグナルは、windows-killを使用してプログラムに送信できます。構文windows-kill -SIGINT PIDは、PIDMicrosoft のpslistで取得できます。

SIGINT のキャッチに関しては、プログラムが Python の場合、このソリューションのように SIGINT 処理/キャッチを実装できます。

于 2020-10-02T05:45:18.553 に答える
1

jconsole を使用して、実行中のすべてのスレッドのスタックトレースを表示することもできます。これは、Windows および Java をサポートするその他の OS で動作します。jconsole には、メモリ グラフ、CPU グラフなど、他にも多くの優れた機能があります。

元の質問には答えませんが、うまくいけば同じ結果が得られます。

jconsole に慣れていない場合は、JConsole の使用に関するドキュメントを参照してください。

于 2008-09-26T15:14:33.573 に答える
0

Ruby はどういうわけか Windows で SIGINT SIGKILL などを (少なくともエミュレート) し、それらのメッセージをトラップすることができます。それをチェックしたいかもしれません。

ルビーがどのように「シグナル SIGINT をそのプロセスに送信する」かは、Windows で、実際にはTerminateProcessその PID で呼び出すか、同等です。

「ctrl + cをキャッチする」ためのWindows同等の方法もあります。それがそこで呼び出されるものだと思います。

于 2012-03-15T16:29:21.407 に答える
0

現在 Microsoft が所有しているSysInternals の PsTools役立つかどうか疑問に思っています。

于 2008-09-26T15:15:25.413 に答える