Quando um processo termina no UNIX?

2

Em que momento um processo no Unix é finalizado? É necessário que um comando como exit(0) ou return 0 seja escrito em um programa para encerrar um processo? Minha pergunta é provocada pelo seguinte código:

pid_t pid=fork();
if(pid < 0)
{
         perror("Fork error\n");
         return 1;  
}
else if (pid==0) /* child */
{
        printf("CHILD My pid is:%d\n",getpid());
}
else /* parrent */
{
         wait(NULL);
         exit(0);
}

Neste exemplo, no filho, NÃO chamamos exit(0) (portanto, acho que NÃO terminamos o processo) e no pai, chamamos wait(NULL) (portanto, devemos aguardar o término do processo). O programa termina, então logicamente em um momento o processo filho termina. Você pode me explicar quando o processo infantil termina? Se a criança terminar após

else if (pid==0) /* child */
    {
            printf("CHILD My pid is:%d\n",getpid());
    }/* Probably the child process terminates here but then what is the point of using exit(0) */

, bem, qual é o sentido de usar exit(0) ?

    
por george 25.09.2015 / 17:55

2 respostas

3

Um programa C terminará em uma das três condições:

  1. O programa retorna da função main . Se o valor de retorno for 0, isso indica sucesso, caso contrário, o valor de retorno é o estado de saída. O C99 também permite (mas desencoraja) uma função main com um tipo de retorno void , em que o retorno de main tem a mesma semântica que retornar 0 de um main com o tipo de retorno int .
  2. O programa retorna uma das funções exit : exit , _exit ou a nova função quick_exit em C11. Todas essas funções não retornam e todas têm o efeito de encerrar o programa, mas o que elas realmente fazem é diferente (por exemplo, quick_exit libera buffers, mas não executa honras atexit chamadas).
  3. O sistema operacional mata o programa de alguma forma, por exemplo, porque o programa faz algo que não é permitido fazer.
por 25.09.2015 / 19:25
1

exit(0) (ou talvez mais idealmente, exit(EXIT_SUCCESS) ) pode ser usado para indicar explicitamente que tudo correu bem. Ou seja, é mais uma dica para alguém ler o código quanto ao que deve acontecer e para impedir que qualquer código subseqüente seja atingido (há avisos do compilador que podem ser habilitados para código não-alcançado). O filho provavelmente também deve ter uma chamada _exit para indicar que está pronto, caso contrário, o código cairá para o que vier depois do bloco condicional error / child / parent.

Caso contrário, os processos podem terminar normalmente (via exit , return em main ou _exit ), ou anormalmente, chamando abort ou comendo um sinal (via raise ou de em outro lugar) que faz com que o programa saia.

    
por 25.09.2015 / 18:20

Tags