[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