我有一个使用Runtime.getRuntime()启动程序的Java进程.exec(“myBin”)
这个“myBin”可以分叉几次来完成它的工作。
我有一个读者线程,可以从exec()返回的Process对象的InputStream和ErrorStream中读取“myBin”及其子节点的所有输出
我的问题是:如果花费太多时间完成工作,我需要终止进程并等待读者线程完成。(读者线程将在读取EOF时完成)
现在我发现,即使我使用Process.Destroy(),我也只能杀死自己及其所有孩子的“myBin”。因此,在超时之后,EOF从未到达,因此读者线程会挂起,直到所有子进程终止...
有没有办法安全杀死进程和Runtime.exec()
启动的所有子进程我在Linux上,跨平台不在我的脑海里。
答案 0 :(得分:1)
实现此目标的一种方法是让调用fork的进程保存子pids列表。你可以在mybin中实现一个处理程序,它也可以杀死“孩子们”。
另一种选择是使用线程而不是使用分叉。
为什么这不起作用的主要问题是如果你调用fork它会创建一个新的进程,它对父进程没有真正的依赖。