java-процесс 'inputStream застрял

Вот мой сценарий:

процесс A порождает дочерний процесс B и раскручивает потоки, чтобы истощить выходные данные B.процесс B порождает демон C и тоже выводит его результаты.процесс B завершается, процесс-демон все еще жив.процесс A обнаруживает, что процесс B завершен через process.waitFor (). Однако он застревает при чтении входных потоков процесса B. Это потому, что B запустил демон. Входной поток получает EOF только при выходе из процесса C.

Это происходит только в Windows. Я использую ProcessBuilder. Вот решения, которые я придумал, и я хотел бы услышать ваши отзывы, поскольку ни одно из решений, которые мне действительно нравятся:

Я могу использовать jna для запуска процесса-демона C. Таким образом, я могу создать процесс, который «достаточно отделен», и процесс A не застревает при сливе потоков из B. Это работает, но я не очень заинтересован в этом решении, потому что это означает некоторый нативный код (и многое из этого, так как я стремлюсь потреблять входные данные). Некоторое вдохновение, как сделать это через JNA, здесь:http://yajsw.sourceforge.net (однако он содержит гораздо больше материала, чем простой запуск процесса).Беги на jre7. Jdk7 приносит новые вкусности в ProcessBuilder, например, Унаследованные () вещи, которые также решают мою проблему. По-видимому, когда унаследованный () включен, я могу просто закрыть все потоки в процессе демона C (что я делаю в любом случае, потому что это демон), и это решает проблему. Однако мне нужно запустить на jre5 +Закройте System.out и System.err в процессе Bдо порождает процесс-демон C. Опять же, это решает проблему, но мне действительно нужны эти потоки для работы в процессе B, так как я пишу для них полезные вещи. Не хорошо. Я надеялся, что смогу воспользоваться этой характеристикой, поместив какой-то процесс начальной загрузки между B & C, но это не решило проблему.У меня нет такой проблемы на Linux, так что я могу работать только на Linux? Нет не могуСделал процесс A сливом выходы процесса B неблокирующим способом. Это несколько работает, но это не удобно. Например. inputStream.read () не прерывается. Я мог бы использовать inputStream.available (), но он не различает EOF и доступные нулевые байты. Таким образом, решение подходит только в том случае, если процесс A никогда не интересуется EOF вывода B. Кроме того, это решение, кажется, требует больше ресурсов процессора и, как правило, выглядит неловко и не является пуленепробиваемым.Запустите процесс C в режиме --dry-run, где он просто проверяет, можно ли его запустить. Он пытается начать, отправляет приветственное сообщение и выходит. Он больше не работает, поэтому он не будет блокировать чтение. Процесс B может получить достаточную уверенность в том, что C может быть запущен, и мы можем использовать относительно простой код JNA для порождения отдельного процесса без использования его выходных данных (это приводит к тому, что связанный с JNA код делает грязный и тяжелый код, связанный с JNA). Единственная проблема заключается в том, что мы больше не потребляем выходные данные процесса C, но это можно решить, заставив C записать в хорошо известный файл, который может использовать процесс B. Это решение больше похоже на большой и уродливый обходной путь, но отчасти работает для нас. В любом случае, мы пробуем решение 1) в данный момент.

Буду очень признателен за любые подсказки!

Ответы на вопрос(1)

Ваш ответ на вопрос