Kann ein Zombie Waisen haben? Werden die Waisenkinder durch das Ernten des Zombies gestört?

27

Soweit ich weiß, ist ein Zombie-Prozess gestorben, existiert aber immer noch als Platzhalter in der Prozesstabelle, bis sein Elternteil (oder initwenn der Zombie selbst eine Waise ist) seinen Exit-Status überprüft.

Und mein Verständnis von verwaisten Prozessen ist, dass sie noch am Leben sind und ablaufen, aber deren Eltern verstorben sind.

Da ein Zombie bereits tot ist, würden seine Kinder als Waisen betrachtet, nicht wahr? Würden sie davon betroffen sein, den Zombie zu ernten? initWürden sie speziell nur dann als ihre Kinder adoptiert, wenn der Zombie geerntet wurde, oder würden sie adoptiert werden, sobald der Elternteil ein Zombie wurde?

Platzhalter
quelle
Es ist sinnvoll, dass untergeordnete Prozesse repariert werden, initsobald ihre Eltern sterben (und dazu gehört auch, dass sie zu einem Zombie werden). Ein Zombie passt nicht auf seine Kinder auf. Es wird nichts tun. Es ist nur eine Todesstatusinformation, die an einer pidStelle herumschwebt.
PSkocik
Bedeutet das, dass die Waisen eines Zombies keine Zombies werden können, weil sie sofort von einem betreut werden init?
Wildcard
Richtig. Oder wenn sie Zombies werden, wird es nur eine winzige Zeit initdauern, bis sie ernten.
PSkocik
6
Ich kann es kaum erwarten, bis der Titel dieser Frage im Bereich "Hot Network Questions" angezeigt wird ...
Nathan Osman,
@ NathanOsman, das wäre wunderbar gewesen, aber es sieht aus wie ein No-Go. :(
Wildcard

Antworten:

15

Soweit ich weiß, ist ein Zombie-Prozess gestorben, existiert aber immer noch als Platzhalter in der Prozesstabelle, bis sein Elternteil (oder Init, wenn der Zombie selbst eine Waise ist) seinen Exit-Status überprüft.

Richtig.

Und mein Verständnis von verwaisten Prozessen ist, dass sie noch am Leben sind und ablaufen, aber deren Eltern verstorben sind.

Richtig.

Da ein Zombie bereits tot ist, würden seine Kinder als Waisen betrachtet, nicht wahr?

Ja. Wenn der Elternteil stirbt, ist es tot. In Bezug auf seine Kinder spielt es keine Rolle, ob die Eltern als Zombie bleiben: Die Kinder werden zu Waisen, wenn die Eltern sterben, und verlieren dann die Verbindung zu ihren Eltern.

Würden sie davon betroffen sein, den Zombie zu ernten? Würde Init sie nur dann als seine Kinder adoptieren, wenn der Zombie geerntet wurde, oder würden sie adoptiert werden, sobald der Elternteil ein Zombie wurde?

Nein, und letztere wie oben.

Gilles 'SO - hör auf böse zu sein'
quelle
8

Wenn die experimentellen Ergebnisse stimmen, systemdwerden die Waisen des Zombies anscheinend zumindest von init geerntet, sobald dies möglich ist:

foo.c:

#include <unistd.h>

int main(void)
{
    pid_t child = fork();
    if (child < 0)
        return -1;
    if (child == 0)
    {
        pid_t grand_child = fork();
        if (grand_child < 0)
            return -1;
        if (grand_child == 0)
            sleep (1000);
        else
            return 0;
    }
    else
        sleep (1000);
    return 0;
}

In einem Terminal:

$ gcc -o foo foo.c
$ ./foo

In einem anderen Terminal:

$ pgrep foo                         
25548
25549
25550
$ pstree -pa 25548
foo,25548
  └─(foo,25549)
$ pstree -psa 25550
systemd,1
  └─foo,25550
$ ps -o stat,pid -p $(pgrep -d, foo)
STAT   PID
S+   25548
Z+   25549
S+   25550
muru
quelle
Und gut sollte es sein, das ist seine Aufgabe.
Gilles 'SO- hör auf böse zu sein'
@Gilles sicher, wird den Job init Waisen zu sammeln, aber gibt es einige Standards , die angibt , wenn es soll gesammelt werden? Ansonsten würde ich mir vorstellen, dass die Implementierung etwas Spielraum haben könnte.
muru
Ich glaube nicht, dass es dafür einen schriftlichen Standard gibt. POSIX gibt nur an, dass „die übergeordnete Prozess-ID aller vorhandenen untergeordneten Prozesse und Zombie-Prozesse des aufrufenden Prozesses auf die Prozess-ID eines implementierungsdefinierten Systemprozesses festgelegt werden soll.“ Es wird nicht angegeben, was dieser Systemprozess ist oder wie dieser Systemprozess informiert wird. Unter Unix-Systemen ist dieser Systemprozess PID 1, er empfängt SIGCLD und er erntet Prozesse, sobald er dazu kommt.
Gilles 'SO- hör auf böse zu sein'
@Gilles bedeutet, dass es irgendwo einen (wahrscheinlich kinemortophoben) Init geben könnte, der beschließt, die Ernte der Kinder eines Zombies aufzuschieben, bis der Zombie verschwindet?
muru
Vielleicht möchten Sie Gilles auch an unix.stackexchange.com/a/177361/5132 erinnern . Jetzt sind es fast 4 Jahre. ☺
JdeBP