O termo 'normalmente' usado neste contexto tipicamente significa que um processo de execução termina quando se completam todas as suas instruções com sucesso, sem, e. ser morto por sinais ou cair inesperadamente. Por exemplo: Ctrl+C
é atingido enquanto o comando find
está em execução e o find
processo recupera o sinal SIGINT
. O manuseio deste sinal é específico da implementação, mas geralmente isso significa matar o processo normalmente. Uma finalização normal de um programa C
acontece ao retornar com sucesso da função main
sendo a última instrução executada no programa.
Isso contrasta um processo que, por exemplo, não completa todas as instruções e sai de maneira não determinística. Isso pode ser causado por erros programáticos ou pode ser causado por sinais emitidos por outros processos para eliminá-lo. Uma terminação anormal é frequentemente determinada na lógica implementada no programa, e. um processo filho aborta / sai do processo pai com algum valor de retorno x
, indicando algum estado ou evento em execução que não é 'normal'. Por exemplo: um processo recupera o sinal SIGKILL
. Este sinal não pode ser tratado e mata o processo.
Aqui, a abstracção do processo é semelhante a uma função programática, na medida em que ambas partilham a capacidade de devolver um valor ao processo de chamada, e. como o inferno. A semântica desses valores de retorno define o que qualifica uma chamada "bem-sucedida" ou "mal-sucedida". Portanto, neste caso, é o programador que fica com a responsabilidade de definir ou usar essas semânticas.
Para fazer um exemplo concreto: um comando executado a partir de bash
retornará um valor para o responsável pela chamada ao término. Aqui, qualquer valor diferente de 0
indica uma finalização anormal do comando. Em bash
você pode inspecionar a variável $?
para ver o valor de retorno da última instrução executada. A utilização desse valor de retorno pode ser útil ao controlar o fluxo de execução em um script, por exemplo, para evitar a leitura de um arquivo não existente ou algo semelhante.
Há também outras coisas a considerar quando se fala de processos de terminação, como liberar espaço de endereçamento alocado com recursos associados na memória, além de agendamento de tarefas de cpu, mas isso é outro capítulo.