stringtranslate.com

salir (llamada al sistema)

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.

Cómo funciona

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.

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 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 execllamada no logra reemplazar el proceso hijo; llamar atexita rutinas liberaría erróneamente recursos que pertenecen al padre.

Huérfanos y zombies

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.

Ejemplos

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 )

Cáscara de Unix :

salir 0 

Montaje de DOS :

; 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()          

ventanas

En Windows, un programa puede finalizar llamando a la función ExitProcess o RtlExitUserProcess.

Ver también

Referencias

  1. ^ Paul, Matthias R. (30 de julio de 1997) [1 de mayo de 1994]. "II.4. Undokumentierte Eigenschaften externer Kommandos". NWDOS-TIP: consejos y trucos para Novell DOS 7, con un clic para deshacer detalles, errores y soluciones. Versión 157 (en alemán) (3 ed.). Archivado desde el original el 5 de noviembre de 2016 . Consultado el 11 de enero de 2012 . {{cite book}}: |work=ignorado ( ayuda ) (NB. NWDOSTIP.TXTes 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.ZIPcolecció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]

enlaces externos