salir (llamada al sistema)

Llamada mediante la cual un proceso informático finaliza su ejecución

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.

Cómo funciona

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.

Limpiar

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; atexitlas rutinas de llamada liberarían por error recursos que pertenecen al proceso padre.

Huérfanos y zombis

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.

Ejemplos

Los siguientes programas finalizan y devuelven un estado de salida exitoso al sistema.

C :
#incluir <stdlib.h> int main ( void ) { exit ( EXIT_SUCCESS ); /* o devolver EXIT_SUCCESS */ }   
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 ;

Programa PHP :

<?php salir ( 0 );

Pitón :

#!/usr/bin/env python3 import  sys sys . salir ( 0 )

Concha de Unix :

salida 0 

Ensamblaje DOS :

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

Ventanas

En Windows, un programa puede finalizarse a sí mismo llamando a la función ExitProcess o RtlExitUserProcess.

Véase 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 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.ZIPcolecció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]
Obtenido de "https://es.wikipedia.org/w/index.php?title=Salir_(llamada_al_sistema)&oldid=1161362573"