[Cascavel-pm] como apanhar errors de processos filhos iniciados por IPC::Open3 ?

Luis Campos de Carvalho monsieur_champs em yahoo.com.br
Segunda Março 14 19:22:41 PST 2005


Alceu R. de Freitas Jr. wrote:
> Olá monges,
> 
> Estou escrevendo porque já estou ficando sem idéias de
> como capturar erros do IPC::Open3.
> 
> Para quem não conhece, o módulo fornece um método de
> executar um comando externo ao Perl, sem chamar o
> shell, e capturando STDIN, STDERR e STDOUT dele.
> Bastante promissor para que gosta de controle.
> 
> O problema é que eu não estou conseguindo fazer o
> processo filho me retornar algo, um sinal, uma
> mensagem, qualquer coisa, quando ele executar algo que
> dê algum problema.
> 
> Vou citar o que a documentação diz:
> 
> "open3() returns the process ID of the child process.
> It doesn't return on failure: it just raises an
> exception matching /^open3:/. However, exec failures
> in the child are not detected. You'll have to trap
> SIGPIPE yourself."
> 
> Ok, então eu tentei criar uma função anônima para
> ligar com SIGPIPE. O problema é que SEMPRE eu recebo
> SIGPIPE... tanto faz se o aplicativo que o processo
> filho executou retornou erro ou não.
> 
> Eu tentei usar o esquema "eval { }; die $@ if $@;",
> mas também não funciona.
> 
> Eu tentei todas as referências abaixo também:
> 
> http://www.perlmonks.org/index.pl?node_id=151886
> http://www.perlmonks.org/index.pl?node_id=146445
> http://www.perlmonks.org/index.pl?node_id=31831
> http://www.perlmonks.org/index.pl?node_id=28870
> 
> mas nenhum dos exemplos funciona no meu caso.
> 
> O mais estranho é que, até aonde entendi, o processo
> filho deveria executar somente o que eu passo para a
> função como parâmetro. Em alguns dos milhares de
> testes que fiz, me parecia que o filho estava
> repetindo comandos que teriocamente deveriam ser
> executados apenas pelo processo pai. Se eu usasse
> open(-|) e exec, eu poderia separar isso usando um
> 
> if ($pid) { # pai
> 
> 
> } else { # filho
> 
> 
> }
> 
> mas no caso do IPC::Open3 não vejo como fazer isso.
> 
> Se quiserem, eu posso postar depois o código que estou
> tentando fazer aqui. Não sei se estou tentando fazer
> pato botar ovo porque estou rodando isso como CGI.

   Ver o código ajudaria muito.
   Se minhas suposições estão corretas, seu pato está quase tendo um 
infarto do miocárdio enquanto você grita a todo pulmão: BOTE OVOS 
QUADRADOS!!!

   Muito curioso em descobrir por que patos não botam ovos, putamplexos!
-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  Luis Campos de Carvalho is BSc in Comp Science,
  PerlMonk [SiteDocClan], Sao Paulo PM Leader,
  Unix Sys Admin && Certified Oracle DBA
  http://br.geocities.com/monsieur_champs/
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=



Mais detalhes sobre a lista de discussão Cascavel-pm