[Cascavel-pm] como apanhar errors de processos filhos iniciados por
IPC::Open3 ?
Alceu R. de Freitas Jr.
glasswalk3r em yahoo.com.br
Segunda Março 14 13:01:46 PST 2005
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.
Obrigado,
Alceu Rodrigues de Freitas Junior
--------------------------------------
glasswalk3r em yahoo.com.br
http://www.imortais.cjb.net
-----------------------------------------------------------------------
A well-used door needs no oil on its hinges.
A swift-flowing stream does not grow stagnant.
Neither sound nor thoughts can travel through a vacuum.
Software rots if not used.
These are great mysteries -- The Tao Of Programming, 5.1
Yahoo! Mail - Com 250MB de espaço. Abra sua conta! http://mail.yahoo.com.br/
Mais detalhes sobre a lista de discussão Cascavel-pm