O que significa encerrar um processo normalmente?

2

Em um exame, afirma-se:

Give 2 different ways that a process can terminate normally. Describe the differences.

O que significa terminar normalmente ?

    
por Pithikos 05.01.2012 / 23:41

3 respostas

2

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.

    
por 06.01.2012 / 01:06
2

Não sei o que as escolas ensinam hoje em dia, mas imagino que terminar normalmente significa "sair com o status 0 (zero)".

Eu posso pensar em 3 maneiras de fazer isso (pelo menos em um programa C):

return 0;   /* 1 */
exit(0);    /* 2 */
_exit(0);   /* 3 */

Eu acho que (1) e (2) são equivalentes, mas (3) faz com que um processo saia sem liberar seus buffers de saída. Você usaria isso no caso de uma situação fork / exec para evitar a saída dupla de quaisquer bytes armazenados em buffer (por kernel ou stdio) antes que o processo filho seja encerrado.

    
por 06.01.2012 / 00:29
1

Para finalizar um processo, um sinal é enviado para ele. Para a maioria destes sinais, o processo pode capturar tal sinal, fazer algumas coisas (liberar recursos de rede, imprimir adeus) e (na maioria das vezes) terminar.

O que eu descrevi é uma maneira de um processo ser morto normalmente ou normalmente. O processo também pode terminar se tiver terminado seu trabalho ou usando um botão "x" no programa GUI. Mas como esse é um site relacionado a unix, estou supondo o contrário.

Note que dois sinais não podem ser capturados pelo processo, SIGKILL e SIGSTOP . Rescisão por SIGKILL é considerado não término normal.

Finalização normal de killall -SIGHUP firefox e killall -SIGINT firefox

Finalização não simples de killall -SIGKILL firefox

    
por 06.01.2012 / 00:27