Um zumbi pode ter órfãos? As crianças órfãs serão perturbadas ao colher o zumbi?

27

Pelo que entendi, um processo de zumbi morreu, mas ainda existe como um espaço reservado na tabela de processos até que seu pai (ou initse o zumbi é um órfão) verifique seu status de saída.

E meu entendimento dos processos órfãos é que eles ainda estão vivos e em execução, mas cujo pai morreu.

Como um zumbi já está morto, seus filhos seriam considerados órfãos, não? Eles seriam afetados colhendo o zumbi? Especificamente, os initadotaria como seus filhos apenas uma vez que o zumbi fosse colhido, ou eles seriam adotados assim que o pai se tornasse um zumbi?

Curinga
fonte
Faz sentido que os processos filhos sejam reparados initassim que seus pais morrem (e isso inclui se tornar um zumbi). Um zumbi não vai cuidar de seus filhos. Não vai fazer nada. É apenas uma informação de status de morte flutuando em um pidlocal.
PSKocik
Isso significa que os órfãos de um zumbi não podem se tornar zumbis, porque são imediatamente tratados por eles init?
Wildcard
Corrigir. Ou se eles se tornarem zumbis, será apenas por um período minúsculo até que os initcolham.
PSKocik
6
Mal posso esperar até que o título desta pergunta seja
Nathan Osman
@ NathanOsman, isso teria sido maravilhoso, mas parece um não-go. :(
Caractere curinga

Respostas:

15

Pelo que entendi, um processo de zumbi morreu, mas ainda existe como um espaço reservado na tabela de processos até que seu pai (ou init, se o zumbi é órfão) verifica seu status de saída.

Corrigir.

E meu entendimento dos processos órfãos é que eles ainda estão vivos e em execução, mas cujo pai morreu.

Corrigir.

Como um zumbi já está morto, seus filhos seriam considerados órfãos, não?

Sim. Quando o pai morre, está morto. No que diz respeito aos filhos, não importa se o pai permanece como um zumbi: os filhos tornam-se órfãos no momento em que o pai morre, e então perdem qualquer conexão com o pai.

Eles seriam afetados colhendo o zumbi? Especificamente, os adotaria como seus filhos apenas uma vez que o zumbi fosse colhido, ou eles seriam adotados assim que o pai se tornasse um zumbi?

Não, e o último, conforme acima.

Gilles 'SO- parar de ser mau'
fonte
8

Se houver resultados experimentais, parece que pelo menos o systemdinit colherá os órfãos do zumbi o mais rápido possível:

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

Em um terminal:

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

Em outro 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
fonte
E bem, deveria, esse é o seu trabalho.
Gilles 'SO- stop be evil'
@Gilles com certeza, coletar órfãos é trabalho do init, mas existe algum padrão que especifica quando deve ser coletado? Caso contrário, eu imagino que a implementação possa ter alguma margem de manobra.
Muru
Eu não acho que exista um padrão escrito para isso. O POSIX declara apenas que “o ID do processo pai de todos os processos filhos existentes e processos zumbis do processo de chamada deve ser definido como o ID do processo de um processo do sistema definido pela implementação.”, Não diz qual é o processo do sistema. deveria fazer, ou mesmo como esse processo do sistema é informado. Nos sistemas Unix, esse processo do sistema é o PID 1, ele recebe o SIGCLD e colhe os processos assim que chega a ele.
Gilles 'SO- stop be evil'
@Gilles, o que significa que pode haver algum (provavelmente cinemortofóbico) init em algum lugar que decida adiar a colheita dos filhos de um zumbi até que o zumbi desapareça?
Muru
Você também pode lembrar Gilles de unix.stackexchange.com/a/177361/5132 . Já faz quase 4 anos. ☺
JdeBP