En muchos sistemas operativos informáticos , un proceso informático finaliza su ejecución realizando 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 una vez finalizado.
En sistemas operativos Unix y similares a Unix , un proceso se inicia cuando su proceso principal ejecuta una llamada al sistema fork . El proceso padre puede entonces esperar a que finalice el proceso hijo , o puede continuar la ejecución (posiblemente separando otros procesos hijos). Cuando el proceso hijo finaliza ("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. Luego, el proceso principal puede recuperar el estado de salida mediante 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 está disponible para el proceso principal. Normalmente se trata de un valor entero, aunque algunos sistemas operativos (por ejemplo, Plan 9 de Bell Labs ) permiten devolver una cadena de caracteres . Los sistemas que devuelven un valor entero suelen utilizar un valor cero para indicar una ejecución exitosa 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 finalización de éxito, advertencia y error.
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 registrar subrutinas de usuario para que se invoquen al finalizar el programa antes de que el proceso finalice definitivamente. Como paso final de la terminación, se invoca una llamada de salida del sistema primitiva, que informa al sistema operativo que el proceso ha finalizado y le permite reclamar 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 logra reemplazar el proceso hijo; llamar atexit
a rutinas liberaría erróneamente recursos que pertenecen al padre.
Algunos sistemas operativos manejan un proceso hijo cuyo proceso padre ha terminado de una manera especial. Un proceso huérfano de este tipo se convierte en hijo de un proceso raíz especial , que luego espera a que finalice el proceso hijo. Asimismo, se utiliza una estrategia similar para lidiar con un proceso zombie , 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 inactivo. Tratar estos casos especiales mantiene la tabla de procesos del sistema en un estado consistente.
Los siguientes programas finalizan y devuelven un estado de salida exitosa al sistema.
COBOL :
DIVISIÓN DE IDENTIFICACIÓN . ID DE PROGRAMA . PROGRAMA DE ÉXITO . DIVISIÓN DE PROCEDIMIENTO . PRINCIPAL . MUEVA CERO AL CÓDIGO DE RETORNO . FINALIZAR PROGRAMA .
Fortrán :
programa wiki llamada salir ( 0 ) fin programa wiki
Java :
clase pública Éxito { public static void main ( String [] args ) { System . salir ( 0 ); } }
Pascal :
wiki del programa ; comenzar código de salida : = 0 ; extremo de salida .
Archivo por lotes DR-DOS : [1]
salir 0
Perla :
#!/usr/bin/env salida perl ;
PHP :
<?php salir ( 0 );
Pitón :
#!/usr/bin/env python3 import sys sys . salir ( 0 )
salir 0
; Para MASM / TASM.MODELO PEQUEÑO.PILA.CÓDIGOPROC principal CERCA MOV AH, 4 canales ; Servicio 4Ch - Terminar con código de error MOV AL, 0 ; Código de error INT 21h ; Interrupción 21h - Interrupciones generales de DOSENDP principalFIN principal; Comienza en principal
Algunos programadores pueden preparar todo para INT 21h a la vez:
MOV AX, 4C00h ; reemplaza el 00 con tu código de error en HEX
Ensamblaje Linux x86 de 32 bits :
; Para NASMMOV AL, 1 ; Función 1: salir()MOV EBX, 0; Código de retornoENT 80h; # 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
# Para GAS.texto.global _inicio_comenzar: movl $1, %eax # Llamada al sistema número 1: exit() movl $0, %ebx # Sale con estado de salida 0 int $0x80 # Pasa el control al vector de interrupción # invoca la llamada al sistema; en este caso, la llamada al sistema # número 1 con argumento 0
Ensamblaje Linux x86 64 de 64 bits : para FASM
formato ELF64 ejecutable 3 entradas inicio segmento legible inicio ejecutable : ; COSA ; saliendo de mov eax , 60 ; sys_exit número de llamada al sistema: 60 xor edi , edi ; establezca el estado de salida en 0 (`xor edi, edi` es igual a `mov edi, 0`) syscall ; llámalo
OS X 64 bits x86 64 Ensamblaje: para NASM
global_principal sección .texto _main: mov rax , 0x02000001 ; sys_exit número de llamada al sistema: 1 (agregue 0x02000000 para OS X) xor rdi , rdi ; establezca el estado de salida en 0 (`xor rdi, rdi` es igual a `mov rdi, 0`) syscall ; llamar a salir()
En Windows, un programa puede finalizar llamando a la función ExitProcess o RtlExitUserProcess.
{{cite book}}
: |work=
ignorado ( ayuda ) (NB. NWDOSTIP.TXT
es un trabajo completo sobre Novell DOS 7 y OpenDOS 7.01 , que incluye la descripción de muchas características e componentes internos no documentados. Es parte de la MPDOSTIP.ZIP
colección aún más grande del autor mantenida hasta 2001 y distribuida en muchos sitios en el tiempo. El enlace proporcionado apunta a una versión anterior del archivo convertida a HTML.) [1]