Estado de salida
# Estado de salida

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

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. 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

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

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

### Shell y scripts

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. 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

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. 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

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. 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. Con 4DOS y DR-DOS COMMAND.COM, los códigos de salida (en trabajos por lotes) pueden establecerse mediante la orden EXIT n y (en CONFIG.SYS) a través de la orden ERROR=n.

Los estados de salida son a menudo capturados por programas de procesamiento por lotes a través de comandos IF ERRORLEVEL. 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.

### Java

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."

### OpenVMS

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).

### POSIX

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. De éstas, la llamada waitid recupera el estado de salida completo de 32 bits, pero las llamadas más antiguas wait y waitpid 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.

Los sistemas compatibles con POSIX suelen utilizar una convención de cero para éxito y distinto de cero para error. 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.

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. Estos históricamente derivan de sendmail y otros servidores de correo, pero desde entonces han encontrado uso en muchos otros programas.

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.

### Windows

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

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.

