GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Tod des übergeordneten Prozesses erkennen

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.

  1. Öffnen Sie vor dem Fork eine Pipe() oder ein Socketpair().
  2. Nach der Gabelung
    1. Schließen Sie im übergeordneten Element das Leseende der Pipe oder den ersten Socket.
    2. Schließen Sie im Kind das Schreibende der Pipe oder den zweiten Socket.
  3. Verstauen Sie im übergeordneten Dateideskriptor den verbleibenden Dateideskriptor und vergessen Sie ihn.
  4. Verwenden Sie im untergeordneten Element eine der Multiplex-IO-Methoden (select, poll usw.), um den Deskriptor auf Lesbarkeit zu testen
  5. 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.


Linux
  1. Wie beendet man einen Prozess, dessen Eltern Init ist?

  2. Erkennen Sie Prozess, der CPU frisst, ohne:Top, Htop, Ps?

  3. Wie lege ich das Arbeitsverzeichnis des übergeordneten Prozesses fest?

  4. So beenden Sie den Zombie-Prozess

  5. So erhalten Sie einen untergeordneten Prozess aus einem übergeordneten Prozess

So zeigen Sie PPIDs unter Linux an

Rohr B nach D? – A &&B || C | D?

Der untergeordnete Prozess empfängt das SIGINT des übergeordneten Prozesses

Warum kann ich diesen Prozess unter Linux nicht beenden?

Wie behandelt Copy-on-Write in fork() mehrere Forks?

So beenden Sie einen <defunct>-Prozess mit übergeordnetem 1