Могут ли зомби иметь сирот? Будут ли дети-сироты пожинать зомби?

27

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

И я понимаю, что процессы-сироты - это процессы, которые еще живы, но чей родитель умер.

Поскольку зомби уже мертвы, его дети будут считаться сиротами, не так ли? Будут ли они затронуты, пожиная зомби? В частности, будут ли initусыновлять их своими детьми только после того, как зомби будут пожинены, или они будут усыновлены, как только родитель станет зомби?

Wildcard
источник
Для дочерних процессов имеет смысл перезапускаться, initкак только их родитель умирает (и это включает в себя превращение в зомби). Зомби не позаботится о своих детях. Это ничего не сделает. Это просто информация о смертельном статусе pid.
PSkocik
Значит ли это, что зомби-сироты не могут стать зомби, потому что о них сразу же заботятся init?
Wildcard
Правильный. Или, если они действительно станут зомби, это будет только на небольшой промежуток времени, пока они не initпожнут их.
PSkocik
6
Я не могу дождаться, пока название этого вопроса не появится в разделе «Горячие сетевые вопросы» ...
Натан Осман
@NathanOsman, это было бы замечательно, но это похоже на запрет. :(
Wildcard

Ответы:

15

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

Правильный.

И я понимаю, что процессы-сироты - это процессы, которые еще живы, но чей родитель умер.

Правильный.

Поскольку зомби уже мертвы, его дети будут считаться сиротами, не так ли?

Да. Когда родитель умирает, он мертв. Что касается его детей, то не имеет значения, остается ли родитель зомби: дети становятся сиротами в момент смерти родителя, а затем теряют связь с родителем.

Будут ли они затронуты, пожиная зомби? В частности, начнут ли они усыновлять их как своих детей только после того, как зомби будут пожинены, или они будут усыновлены, как только родитель станет зомби?

Нет, и последний, как указано выше.

Жиль "ТАК - перестань быть злым"
источник
8

Если экспериментальные результаты подойдут, то как минимум systemd init пожнет зомби-сирот, как только сможет:

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
Мур
источник
И это должно быть, это его работа.
Жиль "ТАК - перестань быть злым"
@ Жиль, конечно, сбор сирот - дело инициата, но есть ли какой-то стандарт, который определяет, когда его нужно собирать? В противном случае я думаю, что реализация может иметь некоторую свободу действий.
Муру
Я не думаю, что есть письменный стандарт для этого. POSIX только заявляет, что «Идентификатор родительского процесса всех существующих дочерних процессов и процессов-зомби вызывающего процесса должен быть установлен на идентификатор процесса системного процесса, определенного реализацией». Он не говорит, что это за системный процесс. должен делать, или даже как этот системный процесс информируется. В системах Unix этот системный процесс - PID 1, он получает SIGCLD и получает процессы, как только добирается до него.
Жиль "ТАК - перестань быть злым"
@ Жиль означает, что может быть где-то (возможно, кинеморфный) инициатор, который решает отложить пожинать детей зомби, пока зомби не уйдет?
Муру
Вы также можете напомнить Жилю о unix.stackexchange.com/a/177361/5132 . Сейчас почти 4 года. ☺
JdeBP