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.
- Prima del fork, apri una pipe() o una socketpair().
- Dopo il bivio,
- nel genitore, chiudi l'estremità di lettura della pipe, o il primo socket.
- nel figlio, chiudi l'estremità di scrittura della pipe, o il secondo socket.
- Nel genitore, metti da parte il descrittore di file rimanente e dimenticatene.
- Nel bambino, usa uno qualsiasi dei metodi IO multiplexati (select, poll, ecc.) per testare la leggibilità del descrittore
- 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.