2015-11-04 64 views
2

我编写了一个简单的C程序,并将其构建到“AskStack.exe”。Java运行时执行C语言程序得不到输出

#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

检查错误流中的输出 – BackSlash

回答

2

这是发生了什么事。

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

  2. 的AskMe.exe写入线到输出缓冲器标准输出

  3. 的AskMe.exe调用getChar哪些块上等待它的标准输入的字符。

同时

  • Java程序试图读取从子进程标准输出的线。
  • 僵局!

    问题是AskMe.exe尚未刷新标准输出缓冲区。直到它退出后,它才会这样做......在它读完永远不会到达的角色之后!

    有一些可能的解决方法,包括以下内容:

    • 您可以删除getChar()电话。

    • 您可以在printf之后明确清空stdout流。 (但是,这只是将错误移动到另一个地方,Java程序现在将读取并打印“hello world”消息,然后等待子进程退出......这种情况不会发生。)

    • 您可以修改Java程序来为子进程写入一个字符标准输入。如果您不修改AskeMe.exe,则必须在Java程序尝试从孩子读取数据之前完成此操作,否则会再次出现死锁。

    +0

    “在printf之后刷新stdout流”是完美的。 –