2008-12-10 3 views
5

У нас есть программа Perl для проверки XML, который вызывается из программы Java. Он не может писать стандартную ошибку и висит в месте печати.Почему моя программа Java не читает STDERR от Perl?

Perl записывает в STDERR, а программа java считывает STDERR с помощью функции getErrorStream(). Но программа Perl навешивается для записи в STDERR. Я подозреваю, что функция Java полностью блокирует поток STDERR, и Perl ожидает, пока этот поток будет выпущен.

Есть ли способ в Perl преодолеть эту блокировку и написать стандартную ошибку? Поскольку Java делает только чтение, API не должен блокировать поток STDERR в соответствии с java-документом.

Perl фрагмент кода:

sub print_error 
{ 
    print STDERR shift; 
} 

Java фрагмент кода:

while (getErrorStream() != null) 
{ 
    SOP errorMessage; 
} 

Цените помощь заранее.

Спасибо, Mathew Liju

ответ

7

getErrorStream не читает поток ошибок, он просто получает ручку к нему. Поскольку это труба, если вы никогда ее не читали, она заполнит и заставит программу Perl блокироваться.

Вам нужно что-то вроде:

Inputstream errors = getErrorStream(); 
while (errors.read(buffer) > 0) { 
    SOP buffer; 
} 
4

Дополнительный фактор является буферным, что происходит с водопроводными процессами.

По умолчанию используется буфер 30 строк, который поддерживается оболочкой, создающей межпроцессный канал, поэтому, если приложение Perl не создало достаточно данных, оно не будет отправлено на Java-приложение еще не обработано.

4

Может быть this thread имеет возможную причину вашей проблемы:

Добавить 3 строки в верхней части сценария Perl:

use IO::Handle; 
STDOUT->autoflush(1); 
STDERR->autoflush(1); 

Проблема в указанной теме было связано с «способ, которым Perl выполняет буферизацию своего вывода».

Однако здесь Adrian Pronk упоминает в комментариях, что «Perl висит, потому что Java никогда не читает свой вывод».

+0

Perl не будет зависать из-за буферизации, если он не ожидает ответа Java. С буферизацией Java увидит выход в конце концов, даже если это произойдет только тогда, когда выйдет Perl. Perl висит, потому что Java никогда не читает свой вывод – 2008-12-10 12:48:46

4

В идеале, я считаю, что, чтобы избежать тупиковой ситуации, в Java вы должны порождать отдельные потоки для чтения в STDERR и STDOUT. Похоже, Perl блокируется при записи в STDERR, потому что по той или иной причине вы никогда не читаете его на Java.

0
STDOUT->autoflush(1); 
STDERR->autoflush(1); 

Это - необходимая информация! У меня есть приложение Java, использующее некоторые скрипты на Perl, и я получаю только результат после его завершения. Добавляя autoflush(1), я получаю его сразу.

Кстати, у меня есть отдельные темы для чтения STDERR и STDOUT, и это путь.

Спасибо.

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

  • Нет связанных вопросов^_^