GNU/Linux >> Znalost Linux >  >> Linux

Detekce smrti rodičovského procesu

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.

  1. Před rozvětvením otevřete pipe() nebo socketpair().
  2. Po rozcestí
    1. v nadřazeném prvku zavřete čtecí konec kanálu nebo první soket.
    2. v podřízeném prvku zavřete zapisovací konec roury nebo druhou zásuvku.
  3. V nadřazeném prvku schovejte zbývající deskriptor souboru a zapomeňte na něj.
  4. K testování čitelnosti deskriptoru použijte kteroukoli z multiplexovaných metod IO (výběr, dotazování atd.).
  5. 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.


Linux
  1. Náhrada procesu a potrubí?

  2. Jak zabít proces, jehož rodič je init?

  3. Detekce Process Eating CPU bez:Top, Htop, Ps?

  1. Jak nechat podřízený proces zemřít po odchodu rodiče?

  2. Je možné změnit prostředí nadřazeného procesu v Pythonu?

  3. Rozdíl mezi SIGKILL SIGTERM s ohledem na procesní strom

  1. Podřízený proces obdrží SIGINT rodiče

  2. Zjistěte, jaký proces je na druhém konci potrubí

  3. Proč nemohu tento proces v Linuxu zabít?