Wenn sowohl der Eltern- als auch der Kindprozess für ihre gesamte Lebensdauer unter Ihrer Kontrolle sind, besteht die portabelste Methode darin, eine Hälfte einer Pipe oder eines Sockets mit dem Elternprozess zu teilen.
- Öffnen Sie vor dem Fork eine Pipe() oder ein Socketpair().
- Nach der Gabelung
- Schließen Sie im übergeordneten Element das Leseende der Pipe oder den ersten Socket.
- Schließen Sie im Kind das Schreibende der Pipe oder den zweiten Socket.
- Verstauen Sie im übergeordneten Dateideskriptor den verbleibenden Dateideskriptor und vergessen Sie ihn.
- Verwenden Sie im untergeordneten Element eine der Multiplex-IO-Methoden (select, poll usw.), um den Deskriptor auf Lesbarkeit zu testen
- Wenn der Deskriptor lesbar wird, ist der Elternteil mit ziemlicher Sicherheit tot, oder ein seltener Fehler hat einen streunenden Schreibvorgang verursacht, den Sie durch Aufrufen von read() überprüfen können. Wenn der Elternteil wirklich tot war, gibt read() 0 Bytes zurück.
Der Vorteil dieser Methode besteht darin, dass sie Signale vollständig vermeidet, die einer der am schwierigsten zu beherrschenden Mechanismen in UNIX sind, und einen wartebaren Deskriptor bereitstellt, der leicht in einen Netzwerk-Multiplexer oder eine GUI-Ereignisschleife integriert werden kann.
Sie können die übergeordnete Prozess-ID erhalten, indem Sie getppid()
aufrufen und dann das Signal 0 über kill()
senden . Ein Rückkehrcode von 0 zeigt an, dass der Prozess noch aktiv ist.
Wie von @Ariel erwähnt, getppid()
wird entweder die PID des ursprünglichen Elternteils oder die von init zurückgeben, die PID 1 sein wird. Sie müssen also entweder die Eltern-PID speichern, indem Sie getppid()
aufrufen Überprüfen Sie beim Start oder später, ob Ihr Elternteil PID 1 hat.
Laut dieser Antwort können Sie unter Linux auch den Tod des Elternteils über prctl()
erkennen ist PR_SET_PDEATHSIG
Option und ein selbstgewähltes Signal.