Не удается получить стандартный вывод на Java из программы на C с помощью getchar () - PullRequest
5 голосов
/ 01 июля 2011

Я пытаюсь вызвать программу на C из Java и получить стандартный вывод. Вот мой код:

try {
    ProcessBuilder pb = new ProcessBuilder("helloworld.exe");
    pb.redirectErrorStream(true);   // Merge std out and std err into same stream
    program = pb.start();           // Start program

    BufferedReader input = new BufferedReader(new InputStreamReader(program.getInputStream()));

    line = input.readLine();
    while (line != null) {
        System.out.println(line);
        line = input.readLine();
    }   
} catch (IOException e) {
    e.printStackTrace();
}

Вот пример программы c:

int main(){
    printf("Hello world\n");
}

Это прекрасно работает, когда программа, которую я выполняю (в нашем случае helloworld), не имеет getchar(). Однако, если я добавлю getchar() сразу после printf, я никогда ничего не получу из потока ввода. Есть идеи почему?

Спасибо

Ответы [ 3 ]

1 голос
/ 06 июля 2011

Потому что, когда C-программа вызывает getchar, C-программа перестает ждать ввода. И вход никогда не приходит! В конце концов, ваша Java-программа захватывает stdout / stderr, но ничего не делает для подключения к stdin.

Используйте метод экземпляра getOutputStream () в классе Process вашего объекта program, чтобы получить поток, представляющий stdin, аналогичный getInputStream ().

Затем отправьте данные в C-программу, которую ожидает C-программа.

1 голос
/ 01 июля 2011

Как вы сказали, Кайл, вам может потребоваться очистить поток вывода после вызова print, чтобы убедиться, что символы действительно без промедления попадают в стандартный вывод.Вы должны сделать это в обеих программах.Это может быть сделано в C с fflush(stdout); и, вероятно, может быть сделано в Java с чем-то вроде System.out.flush().

- David

0 голосов
/ 01 июля 2011

Очевидно, что дочерний процесс (или ОС, или среда выполнения JAVA, или ..., ...) все еще ожидает символ (getchar), прежде чем отправлять вывод в родительский процесс.

Если вам не нужен ввод, не включайте getchar !!

...