如何从Java向外部进程发送SIGINT信号?

24
我有一个Java应用程序,它创建了一个外部进程并通过InputStream读取该进程的stdout。当我完成时,我需要能够终止该进程。是否有一种方法向此进程发送SIGINT信号?(就像我从控制台按Ctrl+C那样)。
外部进程不是我的代码,我不能修改它。
4个回答

18

3
由于Windows没有信号(Signals),因此没有跨平台的解决方案。 - Thunraz
@Lukas Eder,我有一个问题,如果我在新线程中打开这个进程,然后假设它被挂起等等,我使用Linux中的SIGINT(来自另一个线程)将其杀死,它基本上会杀死我的整个Java程序,是否有可能仅杀死此特定进程而我的程序仍在运行??? - Space Rocker
@SpaceRocker:获取问题答案的最佳方式是在Stack Overflow上提出新问题。 - Lukas Eder
@LukasEder,如果我问这个问题,它会被标记为不当行为,不幸的是,StackOverflow对我有偏见:( - Space Rocker
@SpaceRocker:你为什么这么想呢?理解如何在这里提问需要时间。但是我不认为你的经验(从你的个人资料中看)特别糟糕... - Lukas Eder
显示剩余2条评论

6

如果您想向当前进程(也称为JVM)发送信号,可以使用 sun.misc.Signal.raise() 方法。我个人需要它是因为我正在使用一个JNI库。


似乎这并没有发送实际的信号,只是调用了信号处理程序。是这样吗? - dkagedal
@Jason Axelson 我也在使用 sun.misc.Signal.raise(new Signal("TERM")); 我正在初始化一个JNI组件,它一直运行不停,即使我的其他线程已经停止了。所以我使用这个解决方案来关闭我的应用程序。 - vijayashankard
信号是特定于平台的。例如,在Windows上,只有一部分信号可以被引发。 - rustyx

2

很不幸,Java没有本地发送任意信号的方法。

我同意Lukas的做法,使用Runtime.exec()或者你可以使用类似Posix for Java库的东西。


2

你是否将外部程序作为java.lang.Process运行?因为Process类有一个destroy()方法。


18
似乎发送的是SIGTERM信号,而不是SIGINT。请参见此处的问题:https://dev59.com/vnA85IYBdhLWcg3wF_YO - Lukas Eder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接