Estado de salida

De Wikipedia, la enciclopedia libre

El estado de salida o código de salida (en inglés: exit status) de un proceso en programación informática es un número que el proceso proceso hijo envía a un proceso padre cuando ha terminado de ejecutar un procedimiento específico o tarea delegada. En DOS, esto se conoce como errorlevel.

Cuando se ejecutan programas informáticos, el sistema operativo crea una entidad abstracta llamada proceso en la que se mantiene el estado de ese programa. En sistemas operativos multitarea como Unix o Linux, los procesos activos pueden crear nuevos procesos. El proceso que engendra otro se denomina proceso padre, mientras que los creados son procesos hijos. Los procesos hijos se ejecutan simultáneamente con el proceso padre. La técnica de engendrar procesos hijo se utiliza para delegar algún trabajo a un proceso hijo cuando no hay una razón para detener la ejecución del padre. Cuando el proceso hijo termina de ejecutarse, llama a la llamada al sistema exit. Esta llamada al sistema facilita el paso del código de estado de salida al proceso padre, que puede recuperar este valor utilizando la llamada al sistema wait.

Semántica[editar]

El padre y el hijo pueden tener un acuerdo sobre el significado de los estados de salida. Por ejemplo, es una práctica común en programación que un proceso hijo devuelva cero al padre cuando finaliza con éxito. Además de este valor de retorno del proceso hijo, otra información, como la forma en que el proceso terminó, también puede estar disponible para el proceso padre. Puede haber terminado normalmente o debido a una señal.

El conjunto específico de códigos devueltos es único para el programa que lo establece. Típicamente indica éxito o fracaso. El valor del código devuelto por la función o programa puede indicar una causa específica de fallo. En muchos sistemas, cuanto más alto es el valor, más grave es la causa del error.[1]​ Alternativamente, cada bit puede indicar una condición diferente, siendo estos evaluados por el operador o para dar el valor final; por ejemplo, fsck hace esto.

A veces, si los códigos están diseñados con este propósito en mente, pueden ser utilizados directamente en la lógica del proceso padre para evitar comprobaciones adicionales.

AmigaOS[editar]

En AmigaOS, MorphOS y AROS, se definen cuatro niveles:

  • OK 0
  • WARN 5
  • ERROR 10
  • FAILURE 20

Shell y scripts[editar]

Los scripts de shell suelen ejecutar comandos y capturar sus estados de salida.

Para los propósitos del shell, un comando que sale con un estado de salida cero ha tenido éxito. Un estado de salida distinto de cero indica un fallo. Este esquema aparentemente contraintuitivo se utiliza para que haya una forma bien definida de indicar éxito y diferentes formas de indicar fallos. Cuando un comando es terminado por una señal cuyo número es N, el shell establece la variable $? a un valor mayor que 128. La mayoría de los shells utilizan 128+N. La mayoría de los shells utilizan 128+N, mientras que ksh93 utiliza 256+N.

Si no se encuentra un comando, el shell debería devolver el estado 127. Si se encuentra un comando pero no es ejecutable, el estado de retorno debe ser 126.[2]​ Tenga en cuenta que este no es el caso para todos los shells.

Si un comando falla debido a un error durante la expansión o redirección, el estado de salida es mayor que cero.

Lenguaje C[editar]

El lenguaje de programación C permite a los programas que salen o vuelven de la función main señalar el éxito o el fracaso devolviendo un entero, o devolviendo las macros EXIT_SUCCESS y EXIT_FAILURE. En sistemas tipo Unix son iguales a 0 y 1 respectivamente.[3]​ Un programa C también puede utilizar la función exit() especificando el código de estado entero o la macro exit como primer parámetro.

El valor de retorno de main se pasa a la función exit, que para valores cero, EXIT_SUCCESS o EXIT_FAILURE puede traducirlo a "una forma definida por la implementación" de terminación exitosa o terminación fallida.

Aparte de cero y las macros EXIT_SUCCESS y EXIT_FAILURE, el estándar C no define el significado de los códigos de retorno. Las reglas para el uso de los códigos de retorno varían en las distintas plataformas (consulte las secciones específicas de cada plataforma).

DOS[editar]

En terminología DOS, un errorlevel es un código de salida entero devuelto por un programa ejecutable o subrutina. Los niveles de error suelen oscilar entre 0 y 255.[4][5][6][7]​ En DOS sólo hay 256 códigos de error disponibles, pero DR-DOS 6.0 y superiores soportan códigos de error de 16 bits al menos en CONFIG.SYS.[6]​ Con 4DOS y DR-DOS COMMAND.COM, los códigos de salida (en trabajos por lotes) pueden establecerse mediante la orden EXIT n[6]​ y (en CONFIG.SYS) a través de la orden ERROR=n.[6]

Los estados de salida son a menudo capturados por programas de procesamiento por lotes a través de comandos IF ERRORLEVEL.[4][6]DOS multiusuario soporta una variable de entorno reservada llamada %ERRORLVL% que se actualiza automáticamente durante el retorno de las aplicaciones. COMMAND.COM, bajo DR-DOS 7.02 y superior, soporta una pseudo variable de entorno similar %ERRORLVL% así como %ERRORLEVEL%. En CONFIG.SYS, DR DOS 6.0 y superior soporta ONERROR para comprobar el estado de carga y el código de retorno de los controladores de dispositivos y el código de salida de los programas.[6]

Java[editar]

En Java, cualquier método puede llamar a System.exit(int status), a menos que un gestor de seguridad no lo permita. Esto terminará la máquina virtual Java que se esté ejecutando en ese momento. "El argumento sirve como código de estado; por convención, un código de estado distinto de cero indica una terminación anormal."[8]

OpenVMS[editar]

En OpenVMS, el éxito se indica con valores impares y el fracaso con valores pares. El valor es un entero de 32 bits con los subcampos: bits de control, número de instalación, número de mensaje y gravedad. Los valores de gravedad se dividen entre éxito (Success, Informational) y fracaso (Warning, Error, Fatal).[9]

POSIX[editar]

En Unix y otros sistemas compatibles con POSIX, el proceso padre puede recuperar el estado de salida de un proceso hijo utilizando la familia de llamadas al sistema wait() definidas en wait.h.[10]​ De éstas, la llamada waitid() [11]​ recupera el estado de salida completo de 32 bits, pero las llamadas más antiguas wait() y waitpid() [12]​ recuperan sólo los 8 bits menos significativos del estado de salida.

Las interfaces wait() y waitpid() establecen un estado de salida de tipo int empaquetado como un campo de bits con varios tipos de información de terminación del proceso hijo. Si el hijo terminó de forma abrupta (según lo determinado por la macro WIFEXITED(); la alternativa habitual es que murió por una señal no capturada), la Single UNIX Specification específica que los 8 bits de orden inferior del estado de salida se pueden recuperar del valor de estado utilizando la macro WEXITSTATUS().

En la llamada al sistema waitid() (añadida con SUSv1), el estado de salida hijo y otra información ya no están en un campo de bits sino en la estructura de tipo siginfo_t.[13]

Los sistemas compatibles con POSIX suelen utilizar una convención de cero para éxito y distinto de cero para error.[14]​ Se han desarrollado algunas convenciones en cuanto a los significados relativos de varios códigos de error; por ejemplo GNU recomienda que los códigos con el bit alto se reserven para errores graves.[3]

Los sistemas operativos derivados de BSD han definido un extenso conjunto de interpretaciones preferidas. Los significados para los 15 códigos de estado de 64 a 78 están definidos en sysexits.h.[15]​ Estos históricamente derivan de sendmail y otros servidores de correo, pero desde entonces han encontrado uso en muchos otros programas.[16]

La Guía Avanzada de Bash-Scripting y /usr/include/sysexits.h contienen información sobre el significado de los códigos de estado de salida distintos de 0.[17]

Windows[editar]

Windows utiliza enteros de 32 bits sin signo como códigos de salida,[18][19]​ aunque el intérprete de comandos los trata como con signo.[20]

Los códigos de salida son referenciados directamente, por ejemplo, por el intérprete de línea de comandos CMD.exe en la terminología errorlevel heredada de DOS. Los procesos .NET Framework y Windows PowerShell se refieren a ellos como la propiedad ExitCode del objeto Process.

Véase también[editar]

Referencias[editar]

  1. «Errorlevels». Rob van der Woude's Scripting Pages. Consultado el 26 de agosto de 2007. 
  2. «Shell command language - Exit Status for commands». The Open Group. Consultado el 7 de julio de 2015. 
  3. a b «The GNU C Library Reference Manual 25.6.2: Exit Status». Gnu.org. Consultado el 9 de julio de 2012. 
  4. a b Paul, Matthias R. (1 de mayo de 1997). «BATTIPs — Tips & Tricks zur Programmierung von Batchjobs». MPDOSTIP (en alemán). 7: ERRORLEVEL abfragen. Archivado desde el original el 23 de agosto de 2017. Consultado el 23 de agosto de 2017.  [1] Archivado el 23 de abril de 2021 en Wayback Machine. [2] (NB. BATTIPS.TXT is part of MPDOSTIP.ZIP. The provided link points to a HTML-converted older version of the BATTIPS.TXT file.) [3]
  5. Auer, Eric; Paul, Matthias R.; Hall, Jim (24 de diciembre de 2015). «MS-DOS errorlevels». Archivado desde el original el 24 de diciembre de 2015. 
  6. a b c d e f Paul, Matthias R. (30 de julio de 1997). «NWDOS-TIPs — Tips & Tricks rund um Novell DOS 7, mit Blick auf undokumentierte Details, Bugs und Workarounds». MPDOSTIP. Release 157 (en alemán) (3 edición). Archivado desde el original el 4 de noviembre de 2016. Consultado el 6 de agosto de 2014.  (NB. NWDOSTIP.TXT is a comprehensive work on Novell DOS 7 and OpenDOS 7.01, including the description of many undocumented features and internals. The provided link points to a HTML-converted version of the file, which is part of the MPDOSTIP.ZIP collection.) [4]
  7. Allen, William; Allen, Linda. «Windows 95/98/ME ERRORLEVELs». Archivado desde el original el 7 de julio de 2011. 
  8. «Java 1.6.0 API». Sun Microsystems. Consultado el 6 de mayo de 2008. 
  9. «OpenVMS Format of Return Status Values». H71000.www7.hp.com. Archivado desde el original el 19 de marzo de 2012. Consultado el 9 de julio de 2012. 
  10. sys_wait.h – Definiciones base Referencia, Single Unix Specification, Issue 7 de The Open Group
  11. waitid – Interfaces Referencia, Single Unix Specification, Issue 7 de The Open Group
  12. wait – Interfaces Referencia, Single Unix Specification, Issue 7 de The Open Group
  13. «2.4.3 Signal Actions». The Open Group. Consultado el 8 de febrero de 2019. 
  14. «Chapter 6. Exit and Exit Status». Faqs.org. Consultado el 9 de julio de 2012. 
  15. sysexits(3): preferable exit codes for programs – Funciones de biblioteca en el manual de FreeBSD (en inglés)
  16. Google search for «"sysexits.h" site:github.com» reports «About 3,540 results»; retrieved 2013-02-21.
  17. «Exit Codes with Special Meanings». 
  18. «ExitProcess function». Consultado el 16 de diciembre de 2016. 
  19. «GetExitCodeProcess function». Consultado el 22 de abril de 2022. 
  20. «ExitCodes bigger than 255, possible?». Consultado el 28 de septiembre de 2009.