我正在以下列方式从Java代码启动一个Windows进程(用C ++编写但我没有源代码):
Process p1 = Runtime.getRuntime().exec(cmdAndParams);
p1.waitFor();
我的问题是waitFor()方法永远不会结束。因此,我尝试在一个简单的shell中启动该过程,并在shell中使用许多打印正确结束(我猜是标准输出)。
因此我决定创建并启动一个读取标准输出的线程,即使我现在不需要这些输出。这解决了这个问题。
所以我的问题是以下问题:这个解决方案是“启动并等待具有输出的外部进程的Java标准”,还是意味着本机进程中存在某个问题?如果存在这样的问题,那么C ++编程“错误”可能是问题的根源?
答案 0 :(得分:16)
这是操作系统的事情。子进程正在写入stdout,并且正在缓冲,等待Java进程读取它。当你不读它时,缓冲区最终填满,子进程阻止写入stdout等待缓冲区空间。
您必须处理子进程'stdout(和stderr),无论您使用哪种语言。
我建议您阅读this article(所有4页)并在那里实施建议。