2010-10-19 3 views
2

Я начала процесса окна (писал в C++, но у меня нет источников) из Java-кода следующим образом:Почему Process.waitFor() никогда не возвращается?

Process p1 = Runtime.getRuntime().exec(cmdAndParams); 
p1.waitFor(); 

Моя проблема заключается в том, что метод Waitfor() никогда не кончается. Таким образом, я попытался запустить процесс в простой оболочке, и он корректно заканчивается печатью в оболочке (стандартный вывод, я думаю).

Таким образом, я решил создать и запустить поток, считывающий стандартный вывод, даже если мне сейчас не нужны эти выходы. Это устранило проблему.

Итак, мой вопрос следующий: Является ли это решение «стандартом Java для запуска и ожидания внешних процессов с выводами», или это означает, что есть проблема где-то в собственном процессе? Если такая проблема существует, то может возникнуть проблема программирования на языке C++?

ответ

16

Это вещь ОС. Детский процесс записывает на stdout, и это буферизуется, ожидая, когда ваш процесс Java прочитает его. Когда вы его не читаете, буфер заполняется, и дочерние процессы блокируют запись в stdout, ожидая буферного пространства.

Вам придется обработать дочерний процесс 'stdout (и stderr), какой бы язык вы ни использовали.

Предлагаю вам прочитать this article (все 4 страницы) и выполнить рекомендации там.

+0

Спасибо. Ответ был в Javadoc, но на уровне класса, и я читал только инструкции exec и waitFor doc. В следующий раз я также прочитаю класс doc ;-) –

Смежные вопросы