Чи може зомбі мати дітей-сиріт? Чи будуть турбуватися діти-сироти, пожинаючи зомбі?


27

Як я розумію, процес зомбі загинув, але все ще існує як заповнювач у таблиці процесів, поки його батько (або initякщо зомбі є сиротою) не перевірить свій вихідний статус.

І моє розуміння сирітських процесів - це процеси, які ще живуть і працюють, але чий батько помер.

Оскільки зомбі вже мертве, його дітей вважали б сиротами, чи не так? Чи постраждають вони від того, щоб пожинати зомбі? Зокрема, initприйняли б їх своїх дітей лише після того, як зомбі пожинало, або вони будуть усиновлені, як тільки батько став зомбі?


Дитячі процеси мають сенс відновитись, initяк тільки їх батько помирає (а це включає його перетворення в зомбі). Зомбі не піклується про своїх дітей. Це нічого не зробить. Це просто інформація про смерть, яка пливе навколо у pidмісці.
PSkocik

Чи означає це, що сиріти-зомбі не можуть стати зомбі, тому що за ними негайно доглядають init?
Wildcard

Правильно. Або якщо вони стануть зомбі, це буде лише за незначний проміжок часу, поки initїх не пожинають.
PSkocik

6
Я не можу зачекати, поки в розділі "Гарячі запитання до мережі" з'явиться заголовок цього питання ...
Натан Осман,

@NathanOsman, це було б чудово, але це схоже на відсутність руху. :(
Wildcard

Відповіді:


15

Як я розумію, процес зомбі загинув, але все ще існує як заповнювач у таблиці процесів, поки його батько (або, якщо зомбі є сиротою) не перевірить свій вихідний статус.

Правильно.

І моє розуміння сирітських процесів - це процеси, які ще живуть і працюють, але чий батько помер.

Правильно.

Оскільки зомбі вже мертве, його дітей вважали б сиротами, чи не так?

Так. Коли батько помирає, він мертвий. Що стосується своїх дітей, не має значення, чи залишається батько зомбі: діти стають сиротами в той час, коли помирає батько, і тоді вони втрачають будь-який зв’язок зі своїм батьком.

Чи постраждають вони від того, щоб пожинати зомбі? Зокрема, чи вдасться прийняти їх як своїх дітей лише після того, як зомбі пожинало, або вони будуть усиновлені, як тільки батько став зомбі?

Ні, і остання, як зазначено вище.


8

Якщо експериментальні результати зробляться, то, здається, щонайменше systemdініт пожинає сиріт зомбі, як тільки зможе:

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

В одному терміналі:

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

В іншому терміналі:

$ 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

І добре, що це, це його робота.
Жил "ТАК - перестань бути злим"

@Gilles впевнений, що збирати дітей-сиріт - це робота init, але чи є якийсь стандарт, який визначає, коли його потрібно збирати? Інакше я думаю, що реалізація може мати деяку свободу.
муру

Я не думаю, що для цього є письмовий стандарт. POSIX стверджує лише, що "батьківський ідентифікатор процесу всіх існуючих дочірніх процесів та процесів зомбі процесу виклику повинен бути встановлений на ідентифікатор процесу визначеного впровадженням системного процесу.", Він не говорить про те, що це системний процес що повинен робити, або навіть як інформувати про цей системний процес. У системах Unix цей системний процес є PID 1, він отримує SIGCLD, і він реалізує процеси, як тільки їх обійде.
Жил "ТАК - перестань бути злим"

@Gilles означає, що десь (можливо, кінемортофобічний) може бути десь ініціатор, який вирішить відкласти пожинання дітей зомбі, поки зомбі не піде?
муру

Ви також можете нагадати Жиллю про unix.stackexchange.com/a/177361/5132 . Зараз майже 4 роки. ☺
JdeBP
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.