Un zombie peut-il avoir des orphelins? Les enfants orphelins seront-ils dérangés en récoltant le zombie?

27

Si je comprends bien, un processus zombie est mort mais existe toujours en tant qu'espace réservé dans la table de processus jusqu'à ce que son parent (ou initsi le zombie est lui-même orphelin) vérifie son statut de sortie.

Et ma compréhension des processus orphelins est que ce sont des processus qui sont toujours en vie et en cours mais dont le parent est décédé.

Puisqu'un zombie est déjà mort, ses enfants seraient considérés comme orphelins, non? Seraient-ils touchés par la récolte du zombie? Plus précisément, les initadopteraient-ils comme ses enfants seulement une fois le zombie récolté, ou seraient-ils adoptés dès que le parent deviendrait un zombie?

Caractère générique
la source
Il est logique que les processus enfants soient réparés initdès que leur parent décède (et cela inclut le fait qu'il devienne un zombie). Un zombie ne prendra pas soin de ses enfants. Cela ne fera rien. Ce sont juste des informations sur le statut de décès qui flottent à un pidendroit.
PSkocik
Cela signifie-t-il que les orphelins d'un zombie ne peuvent pas devenir des zombies, car ils sont immédiatement pris en charge par init?
Wildcard
Correct. Ou s'ils deviennent des zombies, ce ne sera que pour une minuscule période de temps jusqu'à ce initqu'ils les récoltent.
PSkocik
6
Je ne peux pas attendre que le titre de cette question apparaisse dans la section "Hot Network Questions" ...
Nathan Osman
@NathanOsman, cela aurait été merveilleux mais cela ressemble à un non-aller. :(
Wildcard

Réponses:

15

Si je comprends bien, un processus zombie est mort mais existe toujours en tant qu'espace réservé dans la table de processus jusqu'à ce que son parent (ou init si le zombie est lui-même orphelin) vérifie son statut de sortie.

Correct.

Et ma compréhension des processus orphelins est que ce sont des processus qui sont toujours en vie et en cours mais dont le parent est décédé.

Correct.

Puisqu'un zombie est déjà mort, ses enfants seraient considérés comme orphelins, non?

Oui. Lorsque le parent décède, il est mort. En ce qui concerne ses enfants, peu importe que le parent reste zombie: les enfants deviennent orphelins au moment de la mort du parent, puis ils perdent tout lien avec leur parent.

Seraient-ils touchés par la récolte du zombie? Plus précisément, init ne les adopterait-il comme ses enfants qu'une fois le zombie récolté, ou serait-il adopté dès que le parent deviendrait un zombie?

Non, et ce dernier, comme ci-dessus.

Gilles 'SO- arrête d'être méchant'
la source
8

Si les résultats expérimentaux réussissent, il semble qu'au moins systemdinit récoltera les orphelins du zombie dès qu'il le pourra:

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

Dans un terminal:

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

Dans un autre 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
la source
Et bien ça devrait, c'est son travail.
Gilles 'SO- arrête d'être méchant'
@ Gilles bien sûr, la collecte des orphelins est le travail d'init, mais existe-t-il une norme qui spécifie quand elle doit être collectée? Sinon, j'imagine que la mise en œuvre pourrait avoir une certaine latitude.
muru
Je ne pense pas qu'il existe une norme écrite pour cela. POSIX indique uniquement que «l'ID de processus parent de tous les processus enfants et processus zombies existants du processus appelant doit être défini sur l'ID de processus d'un processus système défini par l'implémentation.», Il ne dit pas ce qu'est ce processus système. censé faire, ou même comment ce processus système est informé. Sous les systèmes Unix, ce processus système est PID 1, il reçoit SIGCLD et il récolte les processus dès qu'il y parvient.
Gilles 'SO- arrête d'être méchant'
@Gilles, ce qui signifie qu'il pourrait y avoir un init (probablement kinémortophobe) quelque part qui décide de reporter la récolte des enfants d'un zombie jusqu'à ce que le zombie disparaisse?
muru
Vous pouvez également rappeler à Gilles unix.stackexchange.com/a/177361/5132 . Ça fait presque 4 ans, maintenant. ☺
JdeBP