Почему Process.waitFor () никогда не возвращается? - PullRequest
2 голосов
/ 19 октября 2010

Я запускаю процесс Windows (написанный на C ++, но у меня нет источников) из кода Java следующим образом:

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

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

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

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

1 Ответ

16 голосов
/ 19 октября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...