我有一个使用 Runtime.getRuntime().exec("myBin") 启动程序的 Java 进程
这个“myBin”可能会 fork 几次来完成它的工作。
我有一个读取器线程,用于从 exec() 返回的 Process 对象的 InputStream 和 ErrorStream 中读取“myBin”及其子项的所有输出
我的问题是:如果完成工作花费的时间太长,我需要终止进程并等待读取线程完成。(如果读取了 EOF,读取线程将完成)
现在我发现,即使我使用 Process.Destroy(),我也只能杀死“myBin”而不是它本身及其所有子项。因此在超时之后,EOF 从未到达,因此读取器线程挂起,直到所有子进程终止...
有没有办法安全地杀死进程和所有由 Runtime.exec() 启动的子进程
我在 Linux 上,跨平台不是我的想法。
最佳答案
实现此目的的一种方法是让调用 fork 的进程保存子 pid 列表。您可以在 mybin 中实现一个处理程序,它也会触发杀死“ child ”。
另一种选择是使用线程而不是使用 fork 。
为什么这行不通的主要问题是,如果您调用 fork,它将创建一个与父进程没有真正依赖关系的新进程。
关于Java Process.Destroy() 不会杀死所有进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6568291/