En BSD y OS X, puede usar kqueue con EVFILT_PROC+NOTE_EXIT para hacer exactamente eso. No se requiere sondeo. Desafortunadamente, no existe un equivalente de Linux.
También puede crear un socket o un FIFO y leer en ellos. El FIFO es especialmente simple:conecte la salida estándar de su hijo con el FIFO y lea. La lectura se bloqueará hasta que el niño salga (por cualquier motivo) o hasta que emita algunos datos. Por lo tanto, necesitará un pequeño bucle para descartar los datos de texto no deseados.
Si tiene acceso a la fuente del niño, abra el FIFO para escribir cuando comience y luego simplemente olvídese. El sistema operativo limpiará el descriptor de archivo abierto cuando el niño termine y su proceso "principal" en espera se activará.
Ahora bien, este podría ser un proceso que usted no inició o no posee. En ese caso, puede reemplazar el ejecutable binario con un script que inicie el binario real pero que también agregue monitoreo como se explicó anteriormente.
Hasta ahora he encontrado tres formas de hacer esto en Linux:
- Polling:compruebas la existencia del proceso cada cierto tiempo, ya sea usando
kill
o probando la existencia de/proc/$pid
, como en la mayoría de las otras respuestas - Utilice el
ptrace
llamada al sistema para adjuntar al proceso como un depurador para que reciba una notificación cuando salga, como en la respuesta de a3nm - Utilice el
netlink
interfaz para escucharPROC_EVENT_EXIT
mensajes:de esta manera, el kernel le informa a su programa cada vez que un proceso finaliza y usted solo espera la ID de proceso correcta. Solo he visto esto descrito en un lugar en Internet.
Complemento desvergonzado:estoy trabajando en un programa (de código abierto, por supuesto; GPLv2) que hace cualquiera de los tres.
Nada equivalente a wait()
. La práctica habitual es sondear usando kill(pid, 0)
y buscando el valor de retorno -1 y errno
de ESRCH
para indicar que el proceso se ha ido.
Actualización: Desde el kernel de Linux 5.3, existe una llamada al sistema pidfd_open, que crea un fd para un pid dado, que se puede sondear para recibir una notificación cuando el pid haya salido.