Este artículo necesita citas adicionales para su verificación . ( febrero de 2019 ) |
En muchos sistemas operativos de computadoras , un proceso de computadora finaliza su ejecución al realizar una llamada de sistema de salida . En términos más generales, una salida en un entorno multiproceso 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 finaliza.
En los sistemas operativos Unix y similares , un proceso se inicia cuando su proceso padre ejecuta una llamada al sistema fork . El proceso padre puede entonces esperar a que el proceso hijo termine, o puede continuar la ejecución (posiblemente bifurcando otros procesos hijos). Cuando el proceso hijo termina ("muere"), ya sea normalmente al llamar a exit , o de manera 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 al proceso padre. El estado de salida puede ser recuperado entonces por el proceso padre a través de la llamada al sistema wait .
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 padre. 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 correcta 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 correctos, de advertencia y de error.
La operación de salida normalmente realiza operaciones de limpieza dentro del espacio de proceso antes de devolver el control al sistema operativo. Algunos sistemas y lenguajes de programación permiten que se registren las subrutinas de usuario para que se las invoque al finalizar el programa antes de que el proceso finalice definitivamente. Como paso final de la finalización, se invoca una llamada de salida del sistema primitiva, que informa al sistema operativo de que el proceso ha finalizado 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 utilizar, por ejemplo, en una rutina fork-execexec
cuando la llamada no logra reemplazar el proceso hijo; atexit
las rutinas de llamada liberarían por error recursos que pertenecen al proceso padre.
Algunos sistemas operativos manejan un proceso hijo cuyo proceso padre ha finalizado 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 el proceso hijo finalice. De la misma manera, se utiliza una estrategia similar para tratar con un proceso zombi , que es un proceso hijo que ha finalizado pero cuyo estado de salida es ignorado por su proceso padre. Un proceso de este tipo 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 finalización del proceso muerto. El manejo de estos casos especiales mantiene la tabla de procesos del sistema en un estado consistente.
Los siguientes programas finalizan y devuelven un estado de salida exitoso al sistema.
C :
| C++ :#incluir <cstdlib> int main () { std :: exit ( SALIDA_EXITOSA ); // o devolver SALIDA_EXITOSA } |
COBOL :
DIVISIÓN DE IDENTIFICACIÓN . ID DE PROGRAMA . PROGRAMA DE ÉXITO . DIVISIÓN DE PROCEDIMIENTO . PRINCIPAL . MOVER CERO A CÓDIGO DE RETORNO . FIN DEL PROGRAMA .
Fortran :
programa wiki llamar a salir ( 0 ) fin programa wiki
Java :
clase pública Éxito { public static void main ( String [] args ) { System . exit ( 0 ); } }
Pascual :
programa wiki ; comienzo ExitCode := 0 ; fin de salida .
Archivo por lotes DR-DOS : [1]
salida 0
Perla :
#!/usr/bin/env perl salir ;
<?php salir ( 0 );
Pitón :
#!/usr/bin/env python3 import sys sys . salir ( 0 )
salida 0
; Para MASM / TASM.MODELO PEQUEÑO.PILA.CÓDIGOPROC principal CERCA MOV AH, 4Ch ; 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 ; reemplace el 00 con su código de error en HEX
Ensamblaje de Linux de 32 bits x86 :
; Para NASMMOV AL, 1 ; Función 1: salir()MOV EBX, 0 ; Código de retornoINT 80h; # Pasa el control al vector de interrupción # invoca una 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 a la interrupción vector # invoca la llamada al sistema—en este caso la llamada al sistema # número 1 con argumento 0
Ensamblaje de Linux 64 bits x86 64 : para FASM
formato ELF64 ejecutable 3 entrada inicio segmento legible ejecutable inicio: ; STUFF ; saliendo 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 ; llamarlo
OS X 64 bits x86 64 Ensamblaje: para NASM
global_principal sección .texto _main: mov rax , 0x02000001 ; número de llamada al sistema sys_exit: 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 ; llame a exit()
En Windows, un programa puede finalizarse a sí mismo llamando a la función ExitProcess o RtlExitUserProcess.
{{cite book}}
: |work=
ignorado ( ayuda ) (NB. NWDOSTIP.TXT
es un trabajo exhaustivo sobre Novell DOS 7 y OpenDOS 7.01 , que incluye la descripción de muchas características y 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 ese momento. El enlace provisto apunta a una versión anterior del archivo convertida a HTML). [1]