我在C中有一个可执行程序,可以为文件生成大量输出。 当我用Runtime调用这个程序时,像这样:
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程序就会冻结。
- 提前致谢
答案 0 :(得分:1)
如果您还没有,请确保您正在阅读流程的.getOutputStream()
和.getErrorStream()
。查看您的代码段,您似乎只是在执行.exec(...)
(并且可能正在等待.waitFor()
未显示的呼叫完成?)。
Per http://download.oracle.com/javase/6/docs/api/java/lang/Process.html(强调补充):
父进程使用这些流向输入提供输入并获取输出 从子进程。因为一些本机平台只提供 标准输入和输出流的缓冲区大小有限,失败 及时写入输入流或读取输出流 subprocess 可能导致子进程阻塞,甚至死锁。