Si tanto el proceso principal como el secundario están bajo su control durante toda su vida, el método más portátil es compartir la mitad de una tubería o toma con el principal.
- Antes de la bifurcación, abra un pipe() o socketpair().
- Después del tenedor,
- en el padre, cierre el extremo de lectura de la canalización o el primer zócalo.
- en el niño, cierre el extremo de escritura de la tubería o el segundo zócalo.
- En el padre, guarde el descriptor de archivo restante y olvídese de él.
- En el niño, utilice cualquiera de los métodos de E/S multiplexados (selección, sondeo, etc.) para probar la legibilidad del descriptor
- Si el descriptor se vuelve legible, es casi seguro que el padre está muerto o algún error raro provocó una escritura extraviada, que puede verificar llamando a read(). Si el padre realmente estaba muerto, read() devolverá 0 bytes.
La ventaja de este método es que evita por completo las señales, que son uno de los mecanismos más difíciles de dominar en UNIX, y proporciona un descriptor de espera que se puede integrar fácilmente con un multiplexor de red o un bucle de eventos de GUI.
Puede obtener la identificación del proceso principal llamando a getppid()
y luego enviando la señal 0 a través de kill()
. Un código de retorno de 0 indicará que el proceso aún está activo.
Como mencionó @Ariel, getppid()
devolverá el pid del padre original o el de init, que será el pid 1. Por lo tanto, debe almacenar el pid del padre llamando a getppid()
al inicio o más tarde verifique si su padre tiene pid 1.
De acuerdo con esta respuesta en Linux, también puede detectar la muerte del padre a través de prctl()
de PR_SET_PDEATHSIG
opción y una señal elegida por uno mismo.