2009-08-03 12 views
5

Estoy escribiendo un programa que tiene que ejecutar otros procesos externos; en este momento el programa lanza las líneas de comando de los procesos a través de popen, capta cualquier salida, y luego toma el estado de salida a través de pclose.Alternativas a popen/pclose?

Lo que está sucediendo, sin embargo, es que para procesos rápidos (por ejemplo, el proceso iniciado falla rápidamente) la llamada pclose no puede obtener el estado de salida (pclose devuelve -1, errno es ECHILD).

¿Existe alguna manera de imitar el comportamiento del tipo popen/pclose, excepto de forma que se garantice la captura del "evento" final del proceso y el código de retorno resultante? ¿Cómo evito la condición de carrera inherente con pclose y la terminación del proceso lanzado?

Respuesta

3

tenedor/exec/esperar

popen es sólo un envoltorio para simplificar las llamadas tenedor/exec. Si desea adquirir el resultado del niño, deberá crear un conducto, llamar a tenedor, duplicar los descriptores de archivo del niño a la tubería, y luego ejecutar. El padre puede leer el resultado del conducto y llamar a esperar para obtener el estado de salida del niño.

+4

Como popen está disponible en Windows, que no tiene un tenedor, obviamente no siempre es un envoltorio. –

+0

Reescribí mi código para hacer esto (fork/exec/dup/etc.) Y ahora recibo fallas intermitentes en waitpid (...) devolviendo -1/errno = ECHILD. Mierda. – Joe

+3

Ok: me di cuenta de esto. Este código funciona muy bien. Mi código anterior con popen/pclose funciona muy bien. Lo que NO funcionó bien fue el controlador oculto SIGCHLD que estaba enterrado en el código común que heredé. OH SNAP. Básicamente estaba en una carrera contra ese controlador (que simplemente llamaba waitpid (-1, ...). Lección aprendida: lee toda la página del manual, ¡y no asumas nada! – Joe

1

Puede usar vfork() y execv().