Java Runtime执行C语言程序得不到输出

时间:2015-11-04 11:44:02

标签: java c exec

我编写了一个简单的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代码呢?提前谢谢。

1 个答案:

答案 0 :(得分:2)

这里发生了什么。

  1. Java程序启动AskMe.exe程序。

  2. AskMe.exe将一行写入stdout

  3. 的输出缓冲区
  4. AskMe.exe调用getChar阻止等待标准输入的字符。

  5. 同时

    1. Java程序尝试从子进程标准输出中读取一行。
    2. 死锁!

      问题是AskMe.exe还没有刷新标准输出缓冲区。并且在它读完了永远不会到达的角色之后它就会一直这样做...

      有许多可能的修复方法,包括以下内容:

      • 您可以移除getChar()来电。

      • 您可以在stdout之后明确刷新printf流。 (但是这只是将bug移到另一个地方。现在Java程序将读取然后打印&#34; hello world&#34; message,然后等待子进程退出...这不会赢得#t永远都会发生。)

      • 您可以修改Java程序以将字符写入子进程标准输入。如果你没有修改AskeMe.exe,那么必须在Java程序试图从孩子那里读取之前完成...或者你将再次陷入僵局。