Java Process.Destroy()无法杀死所有进程

4

我有一个Java进程,使用Runtime.getRuntime().exec("myBin")启动程序

"myBin"可能会分叉多次才能完成其工作。

我有一个读取器线程,从Process对象的InputStream和ErrorStream中读取“myBin”及其子进程的所有输出。

我的问题是:如果它花费太多时间来完成工作,我需要杀死该进程并等待读取器线程完成。(如果读取器线程已读取EOF,则会完成)

现在我发现,即使我使用Process.Destroy(),我只能杀死“myBin”,而不能杀死它本身和所有子进程。因此,在超时后,EOF永远不会到达,因此读取器线程挂起直到所有子进程终止...

是否有一种方法可以安全地杀死由Runtime.exec()启动的进程和所有子进程?

我在Linux上,跨平台不在我的考虑范围内。

1个回答

1
一种实现这个的方法是让调用fork的进程保存一个子进程pid列表。你可以在mybin中实现一个处理程序,触发杀死“子进程”的操作。
另一个选择是使用线程而不是使用fork。
这样做无法奏效的主要问题是,如果调用fork,它将创建一个新的进程,该进程与父进程没有真正的依赖关系。

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