En muchos sistemas operativos de computadora , un proceso de computadora termina su ejecución haciendo una llamada de salida al sistema . De manera más general, una salida en un entorno de subprocesos múltiples significa que un subproceso de ejecución ha dejado de ejecutarse. Para la gestión de recursos , el sistema operativo recupera recursos ( memoria , archivos , etc.) que fueron utilizados por el proceso. Se dice que el proceso es un proceso muerto después de que termina.
Cómo funciona
Bajo Unix y Unix-como sistemas operativos , se inicia un proceso cuando su proceso padre se ejecuta un tenedor llamada al sistema . El proceso padre puede entonces esperar para el proceso hijo a terminar o puede continuar la ejecución (posiblemente se bifurcan fuera otros procesos secundarios). Cuando el proceso hijo termina ("muere"), ya sea normalmente llamando a exit o de forma anormal debido a una excepción o señal fatal (por ejemplo, SIGTERM , SIGINT , SIGKILL ), se devuelve un estado de salida al sistema operativo y se envía una señal SIGCHLD. enviado al proceso padre. El proceso principal puede recuperar el estado de salida a través de la llamada al sistema de espera .
La mayoría de los sistemas operativos permiten que el proceso de terminación proporcione un estado de salida específico al sistema, que se pone a disposición del proceso principal. Normalmente, se trata de un valor entero, aunque algunos sistemas operativos (por ejemplo, Plan 9 de Bell Labs ) permiten que se devuelva una cadena de caracteres . Los sistemas que devuelven un valor entero suelen utilizar un valor cero para indicar una ejecución satisfactoria y valores distintos de cero para indicar condiciones de error. Otros sistemas (por ejemplo, OpenVMS ) utilizan valores pares para el éxito y valores impares para los errores. Otros sistemas (por ejemplo, IBM z / OS y sus predecesores) utilizan rangos de valores enteros para indicar resultados de éxito, advertencia y finalización de error.
Limpiar
La operación de salida normalmente realiza operaciones de limpieza dentro del espacio del proceso antes de devolver el control al sistema operativo. Algunos sistemas y lenguajes de programación permiten que se registren subrutinas de usuario para que se invoquen al finalizar el programa antes de que el proceso termine definitivamente. Como paso final de la terminación, se invoca una llamada de salida del sistema primitivo, que informa al sistema operativo que el proceso ha terminado y le permite recuperar los recursos utilizados por el proceso.
A veces es posible omitir la limpieza habitual; C99 ofrece la _exit()
función que finaliza el proceso actual sin ninguna limpieza adicional del programa. Esto se puede usar, por ejemplo, en una rutina fork-exec cuando la exec
llamada no reemplaza el proceso hijo; las atexit
rutinas de llamada liberarían erróneamente los recursos que pertenecen al padre.
Huérfanos y zombis
Algunos sistemas operativos manejan un proceso hijo cuyo proceso padre ha terminado de una manera especial. Dicho proceso huérfano se convierte en hijo de un proceso raíz especial , que luego espera a que termine el proceso hijo. Asimismo, se utiliza una estrategia similar para tratar con un proceso zombi , que es un proceso hijo que ha terminado pero cuyo estado de salida es ignorado por su proceso padre. Dicho proceso se convierte en hijo de un proceso padre especial, que recupera el estado de salida del hijo y permite que el sistema operativo complete la terminación del proceso muerto. Tratar con estos casos especiales mantiene la tabla de procesos del sistema en un estado consistente.
Ejemplos de
Los siguientes programas terminan y devuelven un estado de salida satisfactoria al sistema.
C :
| C ++ : #include |
COBOL :
DIVISIÓN DE IDENTIFICACIÓN . PROGRAMA-ID . PROGRAMA DE ÉXITO . DIVISIÓN DE PROCEDIMIENTOS . PRINCIPAL . MUEVA CERO AL CÓDIGO DE VUELTA . FIN DEL PROGRAMA .
Fortran :
programa wiki llamar salir ( 0 ) finalizar programa wiki
Java :
public class Success { public static void main ( String [] args ) { System . salir ( 0 ); } }
Pascal :
programa wiki ; comenzar ExitCode : = 0 ; final de salida .
Archivo por lotes de PC DOS :
salir 0
Perl :
#! / usr / bin / env perl exit ;
PHP :
php exit ( 0 );
Python :
#! / usr / bin / env python3 import sys sys . salir ( 0 )
Shell de Unix :
salir 0
Ensamblaje de PC DOS :
; Para MASM / TASM.MODEL PEQUEÑO.APILAR.CÓDIGOPROC principal CERCA MOV AH, 4Ch ; Servicio 4Ch - Termina con el código de error MOV AL, 0 ; Código de error INT 21h ; Interrupción 21h - Interrupciones generales de DOSprincipal ENDPEND principal; Empieza en la principal
Algunos programadores pueden preparar todo para INT 21h a la vez:
MOV AX, 4C00h ; reemplace el 00 con su código de error en HEX
Ensamblado Linux de 32 bits x86 :
; Para NASMMOV AL, 1; Función 1: salir ()MOV EBX, 0; Código de retornoINT 80h ; # Pasa el control para interrumpir el vector # invoca la llamada al sistema; en este caso, la llamada al sistema # número 1 con el argumento 0
# Para GAS.texto.global _start_comienzo: movl $ 1,% eax # Llamada al sistema número 1: exit () movl $ 0,% ebx # Sale con estado de salida 0 int $ 0x80 # Pasa el control para interrumpir el vector # invoca la llamada al sistema; en este caso, la llamada al sistema # número 1 con argumento 0
Ensamblaje Linux 64-bit x86 64 : para FASM
formato ELF64 ejecutable 3 inicio de entrada segmento ejecutable legible inicio :; COSAS ; saliendo de mov eax , 60 ; sys_exit número de llamada al sistema: 60 xor edi , edi ; establecer el estado de salida en 0 (`xor edi, edi` es igual a` mov edi, 0` ) syscall ; llámalo
Ensamblaje OS X 64-bit x86 64 : para NASM
global _mainsección .text_main: mov rax , 0x02000001 ; sys_exit número de llamada al sistema: 1 (agregue 0x02000000 para OS X) xor rdi , rdi ; establecer el estado de salida en 0 (`xor rdi, rdi` es igual a` mov rdi , 0` ) syscall ; llamar a exit ()
Ventanas
En Windows, un programa se puede terminar llamando a la función ExitProcess o RtlSalirUserProcess.
Ver también
|
|
Referencias
enlaces externos
- : terminar un proceso - Referencia de interfaces del sistema, Especificación única de UNIX , Edición 7 de The Open Group
- Referencia de C ++ para std::exit