添加scanf会使Java中的processInputStream消失

时间:2019-02-09 21:00:53

标签: java c io pipe

我试图在Java 1中运行一个C程序,而Java 1应该可以获取我的C程序的stdin / stadout。在将scanf添加到C代码的那一刻,C似乎看不到Java的输出。

当我仅使用C语言制作printfs并告诉Java readLine时,它可以工作。当我在Java中添加要处理的文件但在C中没有scanfs的那一刻,它也可以工作,只是C会忽略Java的输出。我在printf之后添加scanf的那一刻(并且我可以在printf sleep()之前创建,在行中放入几个printfs()等),尽管它首先执行,但我再也看不到Java内部的printf()效果。

C中的

fflush()可以使Java查看printf(),但C仍然看不到Java的写入。还尝试了writer.flush();并且用Java进行多次写入没有任何效果。并且还尝试通过ProcessBuilder毫无差异地运行Process。

public static void main(String[] args) throws IOException, InterruptedException {

 Process process = Runtime.getRuntime().exec("Project9.exe");

InputStream processInputStream = process.getInputStream();
OutputStream processOutputStream = process.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(processOutputStream));
BufferedReader reader = new BufferedReader(new InputStreamReader(processInputStream));
String val;
int n=0;
while(true){

    while((val=reader.readLine())!=null){
    System.out.println(val);
    }
    writer.write(n);
    writer.newLine();
    n++;
}

和C程序

#include <stdlib.h>
#include <stdio.h>

int main() {

    int n=0;
    while (1) {
        printf("test %d\n", n);
        printf("test %d\n", n);
        printf("test %d\n", n);
        printf("test %d\n",n);
        fflush(stdout); //(1)
        scanf("%d", &n);
    }
return;
}

使用fflush和scanf注释程序可以正确循环。使用scanf但没有fflush时,即使首先执行printfs,它们也不会出现在输出中。使用fflush,我可以判断一下scanf()正在执行,但是C程序似乎看不到Java的输出,并且C程序停止等待scanf()上的输入,而Java程序等待readLine()上。因此,当我通过fflush()解决了一个问题时,我不知道为什么人为输入的C在Java执行时会正确而错误地工作(我也不知道为什么只有在Java执行时才需要fflush())。

问题很简单,因为scanf()似乎看不到Java的内容。

0 个答案:

没有答案