Por que um processo “filho” termina antes de seu pai?

3

Este é o exemplo de código fornecido:

# include <stdio.h>
# include <unistd.h>
void main() {
    static char *mesg[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
    int display(char *), i;
for (i=0; i<10; ++i)
    display(mesg[i]);
sleep(2);
}

int display(char *m) {
char err_msg[25];
switch (fork()) {
    case 0:
        execlp("/bin/echo", "echo", m, (char *) NULL);
        sprintf (err_msg, "%s Exec failure", m);
        perror(err_msg); return(1);
    case -1:
        perror ("Fork failure"); return(2);
    default:
        return(0);
}
}

Agora, minha suposição antes de executar este programa é que os pais terminariam antes de seus filhos. Então minha saída esperada é

0
1
2
3
4
5
6
7
8
9

No entanto, sempre que executo o programa, recebo uma ordem aleatória de processo. Minha pergunta é "por quê?" É por causa de "troca de contexto", onde o processador iria pular entre processos? É "alocação de recursos", onde alguns processos ficam mais do que outros? A ordem do processo pai e filho não está definida e é por isso que temos o processo zumbi e órfão?

    
por SopanhavuthSom 05.10.2015 / 21:06

1 resposta

2

Os processos-filhos começam a ser executados assim que você fork (), na verdade eles nem sequer "iniciam", eles apenas continuam no código após a invocação fork (), assim como o pai faz. Apenas o valor de retorno de fork () é diferente. Pai e filho podem sair em qualquer ordem. Então, sim, a mudança de contexto fará com que todos os processos sejam executados aleatoriamente.

Você terá processos zumbis quando um processo filho sair e o pai não "coletar" corretamente o código de saída filho. Os processos zumbis basicamente consistem apenas em códigos de saída ainda a serem recuperados, e toda vez que você vê um, culpe o processo pai por não tomar cuidado. (Os zumbis são um bug nos pais, exceto se os pais tiverem vida curta e não precisarem se cuidar.) Se o pai sair antes do filho, o processo filho será reparado no PID 1, que fará o código de saída. (Ele também limpará todos os zumbis que o processo teve).

    
por 05.10.2015 / 23:08