【问题标题】:Runtime Exec stop unexpectedly运行时 Exec 意外停止
【发布时间】:2011-11-21 01:02:47
【问题描述】:

我有一个用 C 语言编写的小可执行程序,它可以为文件生成大量输出。 当我用运行时调用这个程序时,像这样:

Runtime r = Runtime.getRuntime();
Process p = null;

p = r.exec("./my_program -in input.file -out output.file", null, new File(System.getProperty("java.io.tmpdir")));

当程序产生低输出时一切正常,但是当我用大输入调用“*my_program*”时,它将产生大量输出到 output.file,但在这种情况下,我的 Java 程序冻结并什么都没发生……

我在终端中使用大量大型输入测试“*my_program*”,一切正常,但是当我使用 Runtime.exec 在 Java 中调用该程序时,Java 程序冻结。

-- 提前致谢

【问题讨论】:

  • 这篇文章有点旧,但仍然包含相关信息:当Runtime Exec Won't。另外,您的应用程序是 Swing 应用程序吗?可执行程序最终会完成吗?
  • Runtime.exec 本质上是一个管道连接,你必须准备好处理多个信息缓冲区。需要十几行才能正确完成。
  • 不,我的应用程序是一个 Eclipse 插件。我不这么认为,因为我用相同的输入测试了相同的 C 程序,但在终端中运行并且工作正常......
  • @zecapistolas:您显然没有阅读我的链接,该链接的状态与 ziesemer 稍后回答的相同。
  • @HovercraftFullOfEels,还是谢谢你;)

标签: java c runtime runtime.exec


【解决方案1】:

确保您正在阅读 Process 的 .getOutputStream().getErrorStream()(如果尚未阅读)。查看您的代码 sn-p,您似乎只是在执行 .exec(...)(并且可能正在等待它通过未显示给 .waitFor() 的调用完成?)。

http://download.oracle.com/javase/6/docs/api/java/lang/Process.html(强调添加):

父进程使用这些流来提供输入并获取输出 从子进程。因为有些原生平台只提供 标准输入和输出流的缓冲区大小有限,无法 及时写入输入流或读取输出流 子进程可能导致子进程阻塞,甚至死锁

【讨论】:

  • 是的,你是对的...我的 C 程序有很多 printfs,我删除了它们,现在 Runtime.exec() 工作正常,因为 C 程序的所有输出都转到 output.file ...因此,输出流的大小很小,并且子进程不会阻塞!谢谢;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2015-05-11
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
相关资源
最近更新 更多