Por que o shell não está esperando por um processo filho de um comando depois que o comando sai?

1

Eu tenho aprendido sobre processos UNIX e não consegui entender um ponto. Digamos que temos código assim,

void fork_child()
{
    if (fork() == 0) {
       /* Child */
       printf("Running Child, PID = %d\n",
           getpid());
       while (1)
           ; /* Infinite loop */
    } else {
       /* Parent */
       printf("Terminating Parent, PID = %d\n",
              getpid());
       exit(0);
    }
} 

Eu sei que nós matamos o processo filho explicitamente porque o pai morre antes, mas quando eu executo o código, o shell não espera pelo loop while no processo filho, é mais como executar em segundo plano. Qual é o principal motivo deste problema?

Obrigado

    
por Egemen Sarımaden 20.02.2018 / 19:32

2 respostas

2

Você precisa chamar wait() no pai para bloquear até que o filho seja morto

Veja: link

    
por 20.02.2018 / 19:43
0

O shell em si não conhece realmente os filhos dos processos iniciados. Digamos que o shell inicie o processo A, que então inicia o processo B e depois A sai. O que acontece agora é que B continua rodando, mas é feito filho de init , PID 1. Ele não se torna filho do shell.

_exit(2) man page no Linux (há texto similar em POSIX ):

Any children of the process are inherited by init(1). The process's parent is sent a SIGCHLD signal.

Ter processos sem pai herdados por seus avós não seria uma boa ideia, já que o novo pai precisaria ser responsável por receber SIGCHLD sinais de e chamando wait() no filho. Qualquer programa que executasse qualquer outro programa precisaria estar preparado para lidar com quantidades arbitrárias de crianças.

Naturalmente, se a criança estiver segurando um tubo, a casca ainda está lendo, por exemplo, a partir da substituição de comandos, então o shell terá que esperar, já que ele pode saber que recebeu todas as entradas somente após o fechamento do pipe.

    
por 20.02.2018 / 21:13

Tags