Pokud máte nadřazený i podřízený proces po celou dobu své existence pod vaší kontrolou, nejpřenosnějším způsobem je sdílení jedné poloviny roury nebo soketu s nadřazeným.
- Před rozvětvením otevřete pipe() nebo socketpair().
- Po rozcestí
- v nadřazeném prvku zavřete čtecí konec kanálu nebo první soket.
- v podřízeném prvku zavřete zapisovací konec roury nebo druhou zásuvku.
- V nadřazeném prvku schovejte zbývající deskriptor souboru a zapomeňte na něj.
- K testování čitelnosti deskriptoru použijte kteroukoli z multiplexovaných metod IO (výběr, dotazování atd.).
- Pokud se deskriptor stane čitelným, rodič je téměř jistě mrtvý nebo nějaká vzácná chyba způsobila zbloudilý zápis, což můžete zkontrolovat voláním read(). Pokud byl rodič skutečně mrtvý, funkce read() vrátí 0 bajtů.
Výhodou této metody je, že se zcela vyhýbá signálům, které jsou jedním z nejobtížněji zvládnutelných mechanismů v UNIXu, a poskytuje čekatelný deskriptor, který lze snadno integrovat se síťovým multiplexerem nebo smyčkou událostí GUI.
ID nadřazeného procesu můžete získat voláním getppid()
a poté odeslání signálu 0 přes kill()
. Návratový kód 0 bude indikovat, že proces je stále aktivní.
Jak zmínil @Ariel, getppid()
buď vrátí pid původního rodiče nebo init, což bude pid 1. Takže buď musíte uložit nadřazený pid voláním getppid()
při spuštění nebo později zkontrolujte, zda váš rodič má pid 1.
Podle této odpovědi na Linuxu můžete také zjistit smrt rodiče přes prctl()
's PR_SET_PDEATHSIG
možnost a samostatně zvolený signál.