GNU/Linux >> Linux Esercitazione >  >> Linux

Rileva la morte del processo padre

Se entrambi i processi genitore e figlio sono sotto il tuo controllo per tutta la loro vita, il metodo più portabile è condividere metà di una pipe o di un socket con il genitore.

  1. Prima del fork, apri una pipe() o una socketpair().
  2. Dopo il bivio,
    1. nel genitore, chiudi l'estremità di lettura della pipe, o il primo socket.
    2. nel figlio, chiudi l'estremità di scrittura della pipe, o il secondo socket.
  3. Nel genitore, metti da parte il descrittore di file rimanente e dimenticatene.
  4. Nel bambino, usa uno qualsiasi dei metodi IO multiplexati (select, poll, ecc.) per testare la leggibilità del descrittore
  5. Se il descrittore diventa leggibile, il genitore è quasi certamente morto, o qualche raro bug ha causato una scrittura vagante, che puoi verificare chiamando read(). Se il genitore era davvero morto, read() restituirà 0 byte.

Il vantaggio di questo metodo è che evita completamente i segnali, che sono uno dei meccanismi più difficili da padroneggiare in UNIX, e fornisce un descrittore waitable che può essere facilmente integrato con un multiplexer di rete o un loop di eventi GUI.


Puoi ottenere l'ID del processo padre chiamando getppid() e quindi inviando il segnale 0 tramite kill() . Un codice di ritorno pari a 0 indicherà che il processo è ancora attivo.

Come menzionato da @Ariel, getppid() restituirà il pid del genitore originale o quello di init, che sarà pid 1. Quindi devi memorizzare il pid genitore chiamando getppid() all'avvio o successivamente controlla se il tuo genitore ha pid 1.

Secondo questa risposta su Linux puoi anche rilevare la morte del genitore tramite prctl() è PR_SET_PDEATHSIG opzione e un segnale auto-scelto.


Linux
  1. Nuovo processo genitore quando il processo genitore muore?

  2. Sostituzione del processo e tubo?

  3. Come uccidere un processo il cui genitore è init?

  4. Rileva processo che mangia CPU senza:Top, Htop, Ps?

  5. Come far morire il processo figlio dopo che il genitore è uscito?

Come visualizzare i PPID in Linux

Tubo da B a D? – A&&B || C | D?

Differenza tra SIGKILL SIGTERM considerando l'albero dei processi

Il processo figlio riceve il SIGINT del genitore

In che modo copy-on-write in fork() gestisce più fork?

Come terminare un processo <defunct> con il genitore 1