2011-11-21 111 views
2

我有一个小的可执行程序在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-*”具有大的输入就会产生输出量大到output.file,但在这种情况下,我的程序在Java冻结,并没有发生...

我在终端测试“* my_program *”大量输入和一切都好,但是当我打电话给使用Runtime.exec编写Java程序,Java程序冻结。

- 预先感谢

+0

本文有点旧,但仍包含相关信息:[Runtime Exec will not](http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps。 HTML)。另外,你的应用程序是一个Swing应用程序吗?可执行程序是否最终完成? –

+0

Runtime.exec本质上是一个管道连接,您必须准备好处理多个缓冲区信息。这是十几条线路来做正确的。 –

+0

不,我的应用程序是一个Eclipse插件。我不这么认为,因为我使用相同的输入测试了相同的C程序,但是在终端运行并且工作正常... – josecampos

回答

1

确保您从进程的.getOutputStream().getErrorStream()如果你是不是已经阅读。看看你的代码片段,看起来你只是执行.exec(...)(也许等着它完成,呼叫没有显示到.waitFor()?)。

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

父进程使用这些流喂输入,并从子输出 。由于某些本地平台仅为标准输入和输出流提供有限的缓冲区大小,因此不及时写入输入流或读取 子流程的输出流可能导致子流程阻塞,甚至导致死锁

+0

Yah,你是对的...我的C程序有很多printfs,我删除它们,现在Runtime.exec()可以正常工作,因为C程序的所有输出都会输出。文件...所以,输出流有一个小的尺寸和子进程不会阻止!谢谢 ;) – josecampos