Добавление scanf приводит к исчезновению processInputStream в Java - PullRequest
0 голосов
/ 10 февраля 2019

Я пытался запустить программу на C внутри Java, и Java должна получить stdin / stadout моей программы на C.В тот момент, когда я добавляю scanf к коду C, C, похоже, не видит вывод Java.

Когда я делаю только printf s на C и говорю Java на readLine, это работает.в тот момент, когда я добавляю в Java запись в процесс, но еще не scanf s в C, он также работает, просто C игнорирует вывод Java.В тот момент, когда я добавляю scanf после printf (и могу сделать до printf sleep(), поместить несколько printf() в строку и т. Д.), Я больше не вижу эффекта printf() внутри Java, хотя он выполняетсяfirst.

fflush() в C позволяет Java видеть printf(), но C по-прежнему не может видеть записи Java.Также пробовал writer.flush(); и несколько записей в Java без эффекта, который можно увидеть.А также попытался запустить Process через ProcessBuilder без каких-либо различий.

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, даже printf s не отображаются на выходе, хотя они выполняются первыми.С помощью fflush я могу добраться до точки, которую выполняет scanf(), но программа C, похоже, не видит вывод Java, и программа C перестает ждать ввода на scanf(), пока программа Java ожидаетreadLine().Поэтому, когда я решил одну проблему с помощью fflush(), я понятия не имел, почему C с помощью человеческого ввода работает правильно и неправильно, когда Java выполняет его (также я не знаю, почему fflush() требуется только при выполнении Java).

Проблема просто в том, что scanf(), похоже, не видит записи Java.

...