Linux 支持发送任意 Posix 信号,例如 SIGINT
或 SIGTERM
到使用 kill
命令的进程。虽然 SIGINT
和 SIGTERM
只是无聊的旧方法,以友好或不那么友好的方式结束进程, SIGQUIT
核心转储。这可用于触发正在运行的 Java VM 打印出线程转储,包括所有正在运行的线程的堆栈跟踪——整洁!打印调试信息后,Java VM 将继续执行它之前正在执行的操作;事实上,线程转储只是发生在另一个具有最高优先级的衍生线程中。 (您可以自己尝试使用 kill -3 <VM-PID>
。)
请注意,您还可以使用(不受支持!) Signal
和 SignalHandler
中的类注册自己的信号处理程序—8e8d9b0a85fa4d27d9073599b-3-f20c6,so sun.misc
玩得开心。
但是,我还没有找到向 Windows 进程发送信号的方法。 信号由某些用户输入创建: Ctrl-C
例如在两个平台上触发 SIGINT
。但是似乎没有任何实用程序可以手动向 Windows 上正在运行但非交互的进程发送信号。显而易见的解决方案是使用 Cygwin kill
可执行文件,但虽然它可以使用适当的 Windows API 结束 Windows 进程,但我无法发送 SIGBREAK
(Windows 等同于 SIGQUIT
) 用它;事实上,我认为它能够发送到 Windows 进程的唯一信号是 SIGTERM
。
因此,长话短说并重复标题:如何向 Windows 中的进程发送任意信号?
原文由 morsch 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果你想要明确地/以编程方式杀死任何类型的另一个程序/进程,在 SysInternals 的 pstools 中有一个名为“pskill”的小工具,其行为就像 Unixen 的“kill”一样。
如果你想要其他东西,请继续阅读(尽管我在下面的一些细节上可能是错误的 - 自从我上次仅使用 WinAPI 和 Charles Petzold 的优秀书籍“Programming for Windows”作为指南用 C 语言开发 Windows 程序以来已经过了很久).
在 Windows 上,您没有正确的“信号”,WinMain 和 WinProc 从操作系统接收的功能是简单的 _消息_。例如,当您单击窗口的“X”按钮时,Windows 会向该窗口的处理程序发送消息 WM_CLOSE。当窗口被删除但程序仍在运行时,它发送 WM_DESTROY。当它即将跳出主消息处理循环时,WinMain(不是 WinProc)收到 WM_QUIT。您的程序应该按预期响应所有这些 - 您实际上可以通过在收到 WM_CLOSE 时不做它应该做的事情来开发一个“不可关闭”的应用程序。
当用户从 Windows 任务管理器中选择任务并单击“结束任务”时,操作系统将发送 WM_CLOSE(还有另一个我不记得了)。但是,如果您使用“结束进程”,则该进程会直接终止,不会发送任何消息(来源: The Old New Thing )
我记得有一种方法可以获取另一个进程窗口的 HWND,一旦您知道另一个进程可以通过函数 PostMessage 和 DispatchMessage 向该窗口发送消息。