Java运行时执行C语言程序没有输出

Java Runtime execute C language program get no output

我编写了一个简单的 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. Java 程序启动 AskMe.exe 程序。

  2. AskMe.exe 向 stdout

  3. 的输出缓冲区写入一行
  4. AskMe.exe 调用 getChar 阻塞等待其标准输入上的字符。

同时

  1. Java 程序试图从子进程标准输出中读取一行。

僵局!

问题是 AskMe.exe 还没有刷新标准输出缓冲区。在它退出之前它不会这样做......在它读取了永远不会到达的字符之后!

有许多可能的修复方法,包括:

  • 您可以删除 getChar() 调用。

  • 您可以在 printf 之后显式刷新 stdout 流。 (但这只是将 bug 移到了另一个地方。Java 程序现在将读取并打印 "hello world" 消息,然后等待子进程退出......这永远不会发生.)

  • 您可以修改 Java 程序以将字符写入子进程标准输入。如果您不修改 AskeMe.exe,则必须在 Java 程序尝试从子进程读取之前完成此操作……否则您将再次陷入僵局。