¿Puede un zombie tener huérfanos? ¿Se molestarán los niños huérfanos cosechando al zombi?

27

Según tengo entendido, un proceso zombie ha muerto pero todavía existe como marcador de posición en la tabla de proceso hasta que su padre (o initsi el zombie es en sí mismo un huérfano) verifica su estado de salida.

Y entiendo que los procesos huérfanos son procesos que todavía están vivos y en ejecución pero cuyo padre ha muerto.

Como un zombie ya está muerto, sus hijos serían considerados huérfanos, ¿no? ¿Se verían afectados si cosecharan al zombi? Específicamente, ¿los initadoptaría como sus hijos solo una vez que el zombi fuera cosechado, o serían adoptados tan pronto como los padres se convirtieran en zombis?

Comodín
fuente
Tiene sentido que los procesos secundarios sean reparentados inittan pronto como sus padres mueran (y eso incluye convertirse en un zombi). Un zombie no cuidará a sus hijos. No hará nada. Es solo una información sobre el estado de la muerte que flota en un pidlugar.
PSkocik
¿Eso significa que los huérfanos de un zombie no pueden convertirse en zombies, porque son atendidos de inmediato init?
Comodín el
Correcto. O si se convierten en zombies, será solo por un período minúsculo hasta que los initcoseche.
PSkocik
66
No puedo esperar hasta que el título de esta pregunta aparezca en la sección "Preguntas de la red caliente" ...
Nathan Osman
@NathanOsman, eso habría sido maravilloso, pero parece un no-ir. :(
Comodín

Respuestas:

15

Según tengo entendido, un proceso zombie ha muerto pero todavía existe como marcador de posición en la tabla de procesos hasta que su padre (o init si el zombie es en sí mismo huérfano) verifica su estado de salida.

Correcto.

Y entiendo que los procesos huérfanos son procesos que todavía están vivos y en ejecución pero cuyo padre ha muerto.

Correcto.

Como un zombie ya está muerto, sus hijos serían considerados huérfanos, ¿no?

Sí. Cuando el padre muere, está muerto. Con respecto a sus hijos, no importa si el padre permanece como un zombi: los niños se vuelven huérfanos en el momento en que el padre muere, y luego pierden cualquier conexión con su padre.

¿Se verían afectados si cosecharan al zombi? Específicamente, ¿los adoptará como hijos una vez que el zombi haya sido cosechado, o los adoptará tan pronto como el padre se convierta en zombi?

No, y el último, según lo anterior.

Gilles 'SO- deja de ser malvado'
fuente
8

Si los resultados experimentales funcionan, parece que al menos systemdinit cosechará a los huérfanos del zombi tan pronto como sea posible:

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

En una terminal:

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

En otra 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
fuente
Y bien debería, ese es su trabajo.
Gilles 'SO- deja de ser malvado'
@Gilles seguro, recolectar huérfanos es el trabajo de init, pero ¿hay algún estándar que especifique cuándo se debe recolectar? De lo contrario, me imagino que la implementación podría tener cierto margen de maniobra.
muru
No creo que haya un estándar escrito para eso. POSIX solo establece que "El ID del proceso principal de todos los procesos secundarios existentes y procesos zombies del proceso de llamada se establecerá en el ID del proceso de un proceso del sistema definido por la implementación". No dice cuál es ese proceso del sistema. se supone que debe hacer, o incluso cómo se informa ese proceso del sistema En los sistemas Unix, ese proceso del sistema es PID 1, recibe SIGCLD y cosecha los procesos tan pronto como lo alcanza.
Gilles 'SO- deja de ser malvado'
@Gilles significa que podría haber algún (probablemente cinemofóbico) init en algún lugar que decida aplazar la cosecha de los hijos de un zombie hasta que el zombie se vaya.
muru
Es posible que también desee recordarle a Gilles unix.stackexchange.com/a/177361/5132 . Son casi 4 años, ahora. ☺
JdeBP