Por que meu programa Java não pode ler STDERR do Perl?

votos
5

Temos um programa Perl para validar XML que é invocado a partir de um programa Java. Não é capaz de escrever para o erro padrão e pendurado no local de impressão.

Perl está escrevendo para STDERR e um programa java está lendo o STDERR usando a função getErrorStream (). Mas o programa Perl está pendurado para escrever para stderr. Eu suspeito função Java está bloqueando o fluxo STDERR completamente e Perl está esperando por este fluxo para ser liberado.

Existe uma maneira em Perl para superar este bloqueio e escrever para o erro padrão com força? Desde Java está fazendo apenas ler a API não deve estar bloqueando o fluxo STDERR como por doc java.

Código Perl trecho é:

sub print_error
{
    print STDERR shift;
}

código Java trecho é:

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

Agradeço a ajuda de antecedência.

Obrigado, Mathew Liju

Publicado 10/12/2008 em 08:10
fonte usuário
Em outras línguas...                            


5 respostas

votos
7

não getErrorStream não ler o fluxo de erro, ele só obtém um identificador para ele. Como é um tubo, se você nunca realmente lê-lo, ele vai encher-se e forçar o programa Perl para bloquear.

Você precisa de algo como:

Inputstream errors = getErrorStream();
while (errors.read(buffer) > 0) {
    SOP buffer;
}
Respondeu 10/12/2008 em 08:40
fonte usuário

votos
4

Idealmente, eu acho que, para evitar impasse, em Java você precisa para gerar segmentos separados para ler o STDERR e STDOUT. Parece que Perl está bloqueando ao escrever para stderr, porque por uma razão ou outra você nunca está lendo a partir dele em Java.

Respondeu 10/12/2008 em 15:58
fonte usuário

votos
4

Pode ser esta discussão tem uma causa possível para o seu problema:

Adicione 3 linhas no topo do script Perl:

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

O problema no tópico mencionado estava relacionada com "a forma como Perl é amortecer sua saída".

No entanto, aqui, Adrian Pronk menciona nos comentários que "Perl está pendurado, porque Java não está lendo a sua saída".

Respondeu 10/12/2008 em 08:27
fonte usuário

votos
4

Um fator adicional a considerar é o buffer que ocorre com os processos canalizada.

Não é, por padrão, cerca de um tampão 30-line-ish que é mantido pelo shell criando o tubo inter-processo, por isso, se o aplicativo Perl não criou dados suficientes, ele não terá sido enviada para o aplicativo Java ainda processo.

Respondeu 10/12/2008 em 08:27
fonte usuário

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

Esta é a informação que eu precisava! Eu tenho um aplicativo Java executando alguns scripts Perl e eu só obter a saída depois que ele foi concluído. Ao adicionar o autoflush(1)I obtê-lo imediatamente.

BTW, eu tenho segmentos separados para a leitura STDERRe STDOUT, e esse é o caminho a percorrer.

Obrigado.

Respondeu 24/11/2009 em 19:20
fonte usuário

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