我编写了一个简单的C程序,并将其构建为“AskStack.exe”。
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello world!\n");
getchar();
return 0;
}
然后我使用java程序来执行C程序,我想得到输出。
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Test {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Process p = Runtime.getRuntime().exec("AskStack.exe");
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
do{
line = reader.readLine();
System.out.println(line);
}while(line != null);
p.waitFor();
}
}
但我失败了。 java程序没有输出任何东西。 我注意到,如果我删除C程序的getchar(),它将获得输出。 但我的目的是与C程序进行交互。
那么我该如何修改我的java代码呢?提前谢谢。
答案 0 :(得分:2)
这里发生了什么。
Java程序启动AskMe.exe程序。
AskMe.exe将一行写入stdout
AskMe.exe调用getChar
阻止等待标准输入的字符。
同时
死锁!
问题是AskMe.exe还没有刷新标准输出缓冲区。并且在它读完了永远不会到达的角色之后它就会一直这样做...
有许多可能的修复方法,包括以下内容:
您可以移除getChar()
来电。
您可以在stdout
之后明确刷新printf
流。 (但是这只是将bug移到另一个地方。现在Java程序将读取然后打印&#34; hello world&#34; message,然后等待子进程退出...这不会赢得#t永远都会发生。)
您可以修改Java程序以将字符写入子进程标准输入。如果你没有修改AskeMe.exe,那么必须在Java程序试图从孩子那里读取之前完成...或者你将再次陷入僵局。