[bcn-pm] IPC::Open3 d'un executable que no existeix i gestió d'errors

xdrudis xdrudisatinet.cat
Dme Maig 24 12:47:08 PDT 2006


Hola. 

M'he passat dos dies (bé, suposo que ben comptat un) per caure en el què 
passava. 

Resulta que volia cridar un procés (com qui fa un system()) però m'interessava
capturar la sortida d'error per gestionar-la pel meu compte (a més de 
tornar-la a treure per stderr . Si hagués sabut el que em costaria hauria
fet un tee i llegit el fitxer, però semblava més elegant això del 
open3 , tal com diu el

perldoc -q stderr

Bé. Doncs primer he tingut problemes amb l'stdin (no he aconseguit que el 
procés fill llegeixi el meu stdin però sí que escrigui al meu stdout, no sé
perquè). Me n'he cansat i total d'això en podia prescindint, o sia que li he 
passat un símbol de gensim i a còrrer. Igual era culpa de l'altra error
i si ho tornés a provar ara funcionaria.

Però el problema rar era que de sobte, a partir d'un punt del fitxer de 
prova em duplicava la sortida del fitxer (stdout i stderr) i no entenia
perquè. 

Ara m'he rellegit el perldoc IPC::Open3 de la debian Sid (perl 5.8.8)
i entre que es més nou i que jo ja sabia la solució ho he entés una mica
(no gaire) però a la feina tenia un perl 5.8.2 (en AIX :( ) i no ho he entés. 

Diu que si falla l'exec (com ara si l'executable que vols cridar no
existeix, suposo), reps un SIGPIPE. Doncs jo he posat un handleret i
ni cas, no el rebia pas.

El que si rebia era una exepció, abortava l'eval i quedava l'error al $@.

Però el que m'ha costat d'entendre és que el die o el croak o el que sigui 
el feia el procés fill . D'alguna manera pensava que en cas d'error l'Open3 mataria
el fill que havia creat i donaria l'excepció el pare, però no, deixa el fill viu.


I clar, a partir que el joc de proves cridava a un executable que no existia per 
provar la gestió d'errors, la resta de proves les feina dues vegades (una 
vegada el pare i una el fill). 

I és que, que cridis a un open3 i en sortir de l'eval per excepció tinguis 
dos processos engegats per comptes d'un, no sé, m'ha costat caure-hi. 
Ho he solucionat mirant el pid ($$) al sortir de l'eval i si no era el 
mateix que a l'entrar faig exit (el fill es suicida i el pare segueix).
Trobeu que és normal que funcioni així?. Està poc documentat o sóc jo una
mica curt ? 

P.D. Demà al Viena oi?. Igual vinc per primer cop. Ara que treballo a Barcelona
em va millor.

-- 
Xavi Drudis Ferran
xdrudisatinet.cat


Més informació de la llista de correu Barcelona-pm