Czy zombie może mieć sieroty? Czy sierocym dzieciom przeszkadza zbieranie zombie?

27

Rozumiem, że proces zombie umarł, ale nadal istnieje jako symbol zastępczy w tabeli procesów, dopóki jego rodzic (lub initjeśli sam zombie jest sierotą) sprawdzi status wyjścia.

I rozumiem, że procesy osierocone są takie, które wciąż żyją i działają, ale których rodzic umarł.

Ponieważ zombie już nie żyje, jego dzieci byłyby uważane za sieroty, prawda? Czy wpłynie to na ich zebranie zombie? W szczególności, czy initadoptowaliby je jako swoje dzieci dopiero po zebraniu zombie, czy też byłyby adoptowane, gdy tylko rodzic stał się zombie?

Dzika karta
źródło
Sensowne jest, aby procesy potomne zostały rozpoznane, initgdy tylko ich rodzic umrze (i obejmuje to przekształcenie się w zombie). Zombie nie zaopiekuje się dziećmi. Nic nie zrobi. To tylko informacja o stanie śmierci unosząca się w pidmiejscu.
PSkocik,
Czy to oznacza, że ​​sieroty zombie nie mogą stać się zombie, ponieważ natychmiast są pod opieką init?
Wildcard,
Poprawny. Lub jeśli staną się zombie, minie tylko krótki okres czasu, aż initje zbierze.
PSkocik,
6
Nie mogę się doczekać, aż tytuł tego pytania pojawi się w sekcji „Hot Network Questions” ...
Nathan Osman,
@NathanOsman, byłoby cudownie, ale wygląda na to, że nie da się. :(
Wildcard,

Odpowiedzi:

15

Jak rozumiem, proces zombie umarł, ale nadal istnieje jako symbol zastępczy w tabeli procesów, dopóki jego rodzic (lub init, jeśli sam zombie jest sierotą) sprawdzi status wyjścia.

Poprawny.

I rozumiem, że procesy osierocone są takie, które wciąż żyją i działają, ale których rodzic umarł.

Poprawny.

Ponieważ zombie już nie żyje, jego dzieci byłyby uważane za sieroty, prawda?

Tak. Kiedy rodzic umiera, jest martwy. W odniesieniu do swoich dzieci nie ma znaczenia, czy rodzic pozostanie jako zombie: dzieci stają się sierotami w chwili śmierci rodzica, a następnie tracą kontakt z rodzicem.

Czy wpłynie to na ich zebranie zombie? W szczególności, czy inicjuje adopcję ich jako swoich dzieci dopiero po zebraniu zombie, czy też zostaną adoptowani, gdy tylko rodzic zostanie zombie?

Nie, i to drugie, jak wyżej.

Gilles „SO- przestań być zły”
źródło
8

Jeśli wyniki eksperymentów się powiodą, wydaje się, że przynajmniej systemdinit zbierze sieroty zombie, gdy tylko będzie to możliwe:

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;
}

W jednym terminalu:

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

W innym terminalu:

$ 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
źródło
I tak powinno być, to jest jego praca.
Gilles „SO- przestań być zły”
@Gilles, na pewno zbieranie sierot jest zadaniem init, ale czy istnieje jakiś standard, który określa, kiedy należy je zbierać? W przeciwnym razie wyobrażam sobie, że wdrożenie może mieć trochę swobody.
muru
Nie sądzę, żeby istniał na to pisemny standard. POSIX stwierdza tylko, że „Identyfikator procesu nadrzędnego wszystkich istniejących procesów potomnych i procesów zombie procesu wywołującego powinien być ustawiony na identyfikator procesu procesu systemowego zdefiniowanego w ramach implementacji.”, Nie określa, czym jest ten proces systemowy powinien zrobić, a nawet jak ten proces systemowy jest informowany. W systemach Unix ten proces systemowy to PID 1, otrzymuje SIGCLD i zbiera procesy, gdy tylko się do niego zbliży.
Gilles „SO- przestań być zły”
@Gilles oznacza, że ​​może być gdzieś (prawdopodobnie kinemortofobiczny) inicjator, który zdecyduje się odłożyć zbieranie dzieci zombie, dopóki zombie nie zniknie?
muru
Możesz także przypomnieć Gillesowi o unix.stackexchange.com/a/177361/5132 . To już prawie 4 lata. ☺
JdeBP,