Linux支持使用kill
命令向进程发送任意的Posix-Signal,例如SIGINT
或SIGTERM
。虽然SIGINT
和SIGTERM
只是一种友好或不那么友好的结束进程的老方法,但SIGQUIT
用于触发核心转储。这可用于触发正在运行的Java VM打印线程转储,包括所有运行线程的堆栈跟踪 -- 很棒!在打印调试信息后,Java VM将继续执行它之前正在做的事情;实际上,线程转储只是以最高优先级的另一个派生线程进行的。(您可以使用kill -3 <VM-PID>
来尝试自己执行此操作。)
请注意,您还可以使用sun.misc
包中的(不受支持的!)Signal
和SignalHandler
类注册自己的信号处理程序,因此您可以尽情享受其中的乐趣。
然而,我还没有找到一种在Windows进程中发送信号的方法。某些用户输入会创建信号:例如Ctrl-C
在两个平台上都会触发SIGINT
。但是,在Windows上似乎没有任何实用程序可以手动向正在运行但非交互式进程发送信号。显然的解决方案是使用Cygwin的kill
可执行文件,但是尽管它可以使用适当的Windows API结束Windows进程,但我无法使用它发送SIGBREAK
(相当于SIGQUIT
的Windows版本);实际上,我认为它能够发送到Windows进程的唯一信号是SIGTERM
。
因此,长话短说并重申标题:我如何在Windows中向进程发送任意信号?