Na BSD a OS X můžete přesně to udělat pomocí kqueue s EVFILT_PROC+NOTE_EXIT. Není vyžadováno žádné hlasování. Bohužel neexistuje ekvivalent pro Linux.
Můžete také vytvořit soket nebo FIFO a číst na nich. FIFO je obzvláště jednoduché:Připojte standardní výstup vašeho dítěte k FIFO a čtěte. Čtení se zablokuje, dokud dítě neodejde (z jakéhokoli důvodu) nebo dokud nevyšle nějaká data. Budete tedy potřebovat malou smyčku k odstranění nechtěných textových dat.
Pokud máte přístup ke zdroji dítěte, otevřete FIFO pro zápis při jeho spuštění a pak na to jednoduše zapomeňte. Operační systém vyčistí otevřený deskriptor souboru, když dítě skončí, a váš čekající „rodičovský“ proces se probudí.
Nyní to může být proces, který jste nezačali ani nevlastníte. V takovém případě můžete binární spustitelný soubor nahradit skriptem, který spustí skutečný binární soubor, ale také přidá monitorování, jak je vysvětleno výše.
Zatím jsem našel tři způsoby, jak to udělat v Linuxu:
- Dotazování:Existenci procesu kontrolujete často, buď pomocí
kill
nebo testováním existence/proc/$pid
, stejně jako ve většině ostatních odpovědí - Použijte
ptrace
systémové volání pro připojení k procesu jako ladicí program, takže budete upozorněni, když skončí, jako v odpovědi a3nm - Použijte
netlink
rozhraní pro nasloucháníPROC_EVENT_EXIT
zprávy - tímto způsobem jádro sdělí vašemu programu pokaždé, když proces skončí, a vy jen čekáte na správné ID procesu. Viděl jsem to popsané pouze na jednom místě na internetu.
Nestydatá zásuvka:Pracuji na programu (samozřejmě s otevřeným zdrojovým kódem; GPLv2), který umí kterýkoli z těchto tří.
Nic ekvivalentní wait()
. Obvyklou praxí je dotazování pomocí kill(pid, 0)
a hledá návratovou hodnotu -1 a errno
z ESRCH
na znamení, že proces je pryč.
Aktualizace: Od linuxového jádra 5.3 existuje pidfd_open syscall, které vytvoří fd pro daný pid, který může být dotazován, aby dostal upozornění, když pid skončil.