GNU/Linux >> Tutoriales Linux >  >> Linux

Detectar la muerte del proceso principal

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.

  1. Antes de la bifurcación, abra un pipe() o socketpair().
  2. Después del tenedor,
    1. en el padre, cierre el extremo de lectura de la canalización o el primer zócalo.
    2. en el niño, cierre el extremo de escritura de la tubería o el segundo zócalo.
  3. En el padre, guarde el descriptor de archivo restante y olvídese de él.
  4. En el niño, utilice cualquiera de los métodos de E/S multiplexados (selección, sondeo, etc.) para probar la legibilidad del descriptor
  5. 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.


Linux
  1. ¿Cómo hacer que el proceso hijo muera después de que el padre salga?

  2. ¿Obtener programáticamente el id principal de otro proceso?

  3. ¿Cómo obtener el valor de retorno de CHILD PROCESS?

  4. Cómo matar el proceso zombie

  5. Cómo obtener un proceso secundario del proceso principal

Cómo mostrar PPID en Linux

¿Sustitución de proceso y tubería?

Tubería B a D? – A &&B || C | ¿D?

El proceso hijo recibe SIGINT del padre

Encuentra qué proceso está en el otro extremo de una tubería

Cómo matar un proceso <difunto> con el padre 1