Почему моя программа Java не может прочитать STDERR в Perl?

голоса
5

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

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

Задан 10/12/2008 в 08:10
источник пользователем
На других языках...                            


5 ответов

голоса
7

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

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

Inputstream errors = getErrorStream();
while (errors.read(buffer) > 0) {
    SOP buffer;
}
Ответил 10/12/2008 в 08:40
источник пользователем

голоса
4

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

Ответил 10/12/2008 в 15:58
источник пользователем

голоса
4

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

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

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

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

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

Ответил 10/12/2008 в 08:27
источник пользователем

голоса
4

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

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

Ответил 10/12/2008 в 08:27
источник пользователем

голоса
0
STDOUT->autoflush(1);
STDERR->autoflush(1);

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

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

Благодарю.

Ответил 24/11/2009 в 19:20
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more