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 代码?提前致谢。
这是正在发生的事情。
Java 程序启动 AskMe.exe 程序。
AskMe.exe 向 stdout
的输出缓冲区写入一行
AskMe.exe 调用 getChar
阻塞等待其标准输入上的字符。
同时
- Java 程序试图从子进程标准输出中读取一行。
僵局!
问题是 AskMe.exe 还没有刷新标准输出缓冲区。在它退出之前它不会这样做......在它读取了永远不会到达的字符之后!
有许多可能的修复方法,包括:
您可以删除 getChar()
调用。
您可以在 printf
之后显式刷新 stdout
流。 (但这只是将 bug 移到了另一个地方。Java 程序现在将读取并打印 "hello world" 消息,然后等待子进程退出......这永远不会发生.)
您可以修改 Java 程序以将字符写入子进程标准输入。如果您不修改 AskeMe.exe,则必须在 Java 程序尝试从子进程读取之前完成此操作……否则您将再次陷入僵局。
我编写了一个简单的 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 代码?提前致谢。
这是正在发生的事情。
Java 程序启动 AskMe.exe 程序。
AskMe.exe 向 stdout
的输出缓冲区写入一行
AskMe.exe 调用
getChar
阻塞等待其标准输入上的字符。
同时
- Java 程序试图从子进程标准输出中读取一行。
僵局!
问题是 AskMe.exe 还没有刷新标准输出缓冲区。在它退出之前它不会这样做......在它读取了永远不会到达的字符之后!
有许多可能的修复方法,包括:
您可以删除
getChar()
调用。您可以在
printf
之后显式刷新stdout
流。 (但这只是将 bug 移到了另一个地方。Java 程序现在将读取并打印 "hello world" 消息,然后等待子进程退出......这永远不会发生.)您可以修改 Java 程序以将字符写入子进程标准输入。如果您不修改 AskeMe.exe,则必须在 Java 程序尝试从子进程读取之前完成此操作……否则您将再次陷入僵局。