一尘不染

在Windows中发送任意信号?

java

Linux支持使用-Command 向进程发送任意Posix-
Signal,例如SIGINTSIGTERM发送给进程kill。虽然SIGINT并且SIGTERM以无聊或友好的方式结束流程的乏味老方法,SIGQUIT是要触发核心转储。这可以用来触发正在运行的Java
VM以打印出线程转储,包括所有正在运行的线程的堆栈跟踪-整齐!在打印调试信息之后,Java
VM将继续执行以前的操作;实际上,线程转储仅发生在另一个具有最高优先级的派生线程中。(您可以使用自己进行尝试kill -3 <VM-PID>。)

请注意,您还可以使用-
package中的(不支持!)SignalSignalHandler类注册自己的信号处理程序sun.misc,因此您可以从中获得各种乐趣。

但是,我还没有找到一种向Windows进程发送信号的方法。
信号是由某些用户输入创建的:例如,在两个平台上都Ctrl-C触发一个SIGINT。但是,似乎没有任何实用程序可以将信号手动发送到Windows上正在运行的非交互进程。显而易见的解决方案是使用Cygwin
kill可执行文件,但是尽管它可以使用适当的Windows
API结束Windows进程,但我无法随其发送SIGBREAK(与Windows等效SIGQUIT)。实际上,我认为它能够发送到Windows进程的唯一信号是SIGTERM

因此,总而言之,重复一下标题:如何向Windows中的进程发送任意信号?


阅读 913

收藏
2020-12-03

共1个答案

一尘不染

如果您要明确/以编程方式杀死任何其他程序/进程,则在SysInternals的pstools中,有一个名为“
pskill”的小工具,其行为与Unixen的“ kill”相同。

如果您还需要其他内容,请继续阅读(尽管我可能在下面的某些详细信息上有误-自从我上次仅使用WinAPI和Charles Petzold的出色著作“
Programming for Windows”作为指南开发Windows C程序以来,这已经成为一个世纪。 )。

在Windows上,您没有适当的“信号”,WinMain和WinProc从操作系统接收的功能是简单的 消息 。例如,当您单击窗口的“
X”按钮时,Windows会向该窗口的处理程序发送消息WM_CLOSE。当窗口被删除但程序仍在运行时,它将发送WM_DESTROY。当它即将脱离主消息处理循环时,WinMain(不是WinProc)将收到WM_QUIT。您的程序应按预期对所有这些做出响应-
您实际上可以通过在收到WM_CLOSE后不执行应做的事情来开发“无法关闭”的应用程序。

当用户从Windows任务管理器中选择任务并单击“结束任务”时,操作系统将发送WM_CLOSE(还有另一个我不记得的消息)。但是,如果您使用“结束进程”,则该进程将直接终止,永远不会发送任何消息(来源:旧的新事物)

我记得有一种获取另一个进程窗口的HWND的方法,一旦获得另一个进程可以通过函数PostMessage和DispatchMessage向该窗口发送消息。

2020-12-03