[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