¿Qué se entiende por terminar un process normalmente?

En un examen se afirma:

Proporcione 2 forms diferentes en que un process puede terminar normalmente. Describe las diferencias.

¿Qué se entiende por terminar normalmente ?

El término "normalmente" utilizado en este context típicamente significa que un process de ejecución finaliza cuando se han completado todas sus instrucciones con éxito, sin que, por ejemplo, no se eliminen las señales o se bloquee inesperadamente. Por ejemplo: Ctrl+C se golpea mientras el command find está ejecutando y el process de find recibe la señal SIGINT . Manejar esta señal es específico de la implementación, pero generalmente esto significa matar el process normalmente. Una terminación normal de un progtwig C ocurre al regresar exitosamente de la function main siendo la última instrucción ejecutada en el progtwig.

Esto contrasta un process que, por ejemplo, no completa todas las instrucciones y salidas de manera no determinista. Esto puede ser causado por errores de progtwigción o puede ser causado por señales emitidas por otros processs para matarlo. Una terminación anormal a menudo se determina en la lógica implementada en el progtwig, por ejemplo, un process hijo aborta / sale al process principal con algún valor de retorno x , que indica algún estado o evento en ejecución que no es 'normal'. Por ejemplo: un process recibe la señal SIGKILL . Esta señal no puede manejarse y mata el process.

Aquí, la abstracción del process es similar a una function programática, ya que ambos comparten la capacidad de devolver un valor al process de llamada, por ejemplo, un shell. La semántica de estos valores de retorno define qué califica una llamada "exitosa" o "infructuosa". Entonces, en este caso, es el progtwigdor quien tiene la responsabilidad de definir o usar esta semántica.

Para hacer un ejemplo concreto: un command ejecutado desde bash eventualmente devolverá un valor a su llamante al finalizar. Aquí, cualquier valor que no sea 0 indica la terminación anormal del command. En bash , puedes inspeccionar la variable $? para ver el valor de retorno de la última instrucción ejecutada. El uso de este valor de retorno puede ser útil cuando se controla el flujo de ejecución en una secuencia de commands, por ejemplo, para evitar la lectura de un file no existente o tal.

También hay otras cosas que se deben tener en count al hablar de processs de terminación, como liberar el espacio de direcciones asignado con los resources asociados en la memory, además de la progtwigción de trabajos en la CPU, pero ese es otro capítulo.

No estoy seguro de lo que las escuelas enseñan en estos días, pero supongo que terminar normalmente significa "salir con el estado 0 (cero)".

Puedo pensar en 3 maneras de hacer esto (al less en un progtwig C):

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

Creo que (1) y (2) son casi equivalentes, pero (3) hacen que un process salga sin download sus búferes de salida. Debería usar esto en el caso de una situación fork / exec para evitar la doble salida de cualquier byte almacenado (por kernel o stdio) antes de que el process hijo salga.

Para finalizar un process, se le envía una señal . Para la mayoría de estas señales, el process puede captar tal señal, hacer algunas cosas (liberar resources de networking, imprimir adiós) y (la mayoría de las veces) terminar.

Lo que he descrito es una forma de matar a un process con gracia o normalmente. El process también puede finalizar si ha terminado su trabajo, o usando un button "x" en el progtwig GUI. Pero dado que este es un sitio relacionado con Unix, supongo que sí.

Tenga en count que dos señales no pueden capturarse por process, SIGKILL y SIGSTOP . La terminación por parte de SIGKILL no considera la terminación normal.

Terminación normal
killall -SIGHUP firefox
killall -SIGINT firefox

Terminación no agraciada
killall -SIGKILL firefox