Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java运行时执行C语言程序无法获得输出_Java_C_Exec - Fatal编程技术网

Java运行时执行C语言程序无法获得输出

Java运行时执行C语言程序无法获得输出,java,c,exec,Java,C,Exec,我编写了一个简单的C程序,并将其编译为“AskStack.exe” 但我失败了。java程序没有输出任何内容。 我注意到,如果我删除C程序的getchar(),它将获得输出。 但我的目的是与C程序交互 那么我应该如何修改我的java代码呢?提前感谢。以下是正在发生的事情 Java程序启动AskMe.exe程序 AskMe.exe将一行写入stdout的输出缓冲区 AskMe.exe调用getChar,阻止在其标准输入上等待字符 同时 Java程序试图从子进程的标准输出中读取一行 死锁 问题是As

我编写了一个简单的C程序,并将其编译为“AskStack.exe”

但我失败了。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程序尝试从子项读取之前完成此操作。。。否则你会再次陷入僵局


    检查错误流中的输出“在printf之后刷新标准输出流”是完美的。
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        printf("Hello world!\n");
        getchar();
        return 0;
    }
    
    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();
        }
    
    }