En informática , el estado de salida (también código de salida o valor de salida ) de un proceso terminado es un número entero que se pone a disposición de su proceso padre (o llamador). En DOS , esto puede denominarse nivel de error .
Cuando se ejecutan programas informáticos, el sistema operativo crea una entidad abstracta llamada proceso , en la que se mantiene la información de dicho programa. En sistemas operativos multitarea como Unix o Linux , los procesos activos pueden crear nuevos procesos. El proceso que crea otro se denomina proceso padre , mientras que los creados se denominan procesos hijos . Los procesos hijos se ejecutan simultáneamente con el proceso padre. La técnica de crear procesos hijos se utiliza para delegar parte del trabajo a un proceso hijo cuando no hay motivo para detener la ejecución del padre. Cuando el proceso hijo finaliza su ejecución, sale mediante la llamada al sistema ` exit` . Esta llamada al sistema facilita el envío del código de estado de salida al padre, que puede recuperar este valor mediante la llamada al sistema `wait` .
Semántica
El proceso padre y el hijo pueden entender el significado de los estados de salida. Por ejemplo, es una práctica común de programación que un proceso hijo devuelva cero al padre, lo que indica éxito. Además de este valor de retorno, el proceso padre también puede tener acceso a otra información, como la forma en que el proceso finalizó, ya sea de forma normal o mediante una señal .
El conjunto específico de códigos devueltos es único para el programa que lo establece. Normalmente, indica éxito o fracaso. El valor del código devuelto por la función o el programa puede indicar una causa específica del fallo. En muchos sistemas, cuanto mayor sea el valor, más grave será la causa del error. [ 1 ] Alternativamente, cada bit puede indicar una condición diferente, y estas se evalúan conjuntamente mediante el operador OR para obtener el valor final; por ejemplo, fsck hace esto.
En ocasiones, si los códigos se diseñan teniendo en cuenta este propósito, se pueden utilizar directamente como índice de bifurcación al regresar al programa inicial para evitar pruebas adicionales.
AmigaOS
En AmigaOS , MorphOS y AROS se definen cuatro niveles:
- OK 0
- ADVERTENCIA 5
- ERROR 10
- FALLO 20
Shell y scripts
Los scripts de shell suelen ejecutar comandos y capturar sus estados de salida.
Para los propósitos del intérprete de comandos, un comando que finaliza con un código de salida cero se considera exitoso. Un código de salida distinto de cero indica un fallo. Este esquema, aparentemente contraintuitivo, se utiliza para que exista una forma bien definida de indicar el éxito y diversas formas de indicar los distintos modos de fallo. Cuando un comando finaliza con una señal cuyo número es N, el intérprete de comandos establece la variable $?a un valor mayor que 128. La mayoría de los intérpretes de comandos utilizan 128+N , mientras que ksh93 utiliza 256+N .
Si no se encuentra un comando, el intérprete de comandos debe devolver un estado de 127. Si se encuentra un comando pero no es ejecutable, el estado de retorno debe ser 126. [ 2 ] Tenga en cuenta que esto no se aplica a todos los intérpretes de comandos.
Si un comando falla debido a un error durante la expansión o la redirección, el estado de salida es mayor que cero.
C y C++
Los lenguajes de programación C y C++ permiten que los programas que salen o regresan de la función principal indiquen éxito o fracaso devolviendo un entero, o devolviendo las macrosEXIT_SUCCESS y EXIT_FAILURE. En sistemas tipo Unix, estas son iguales a 0y 1respectivamente. [ 3 ] El programa AC también puede usar la exit()función especificando el estado entero o la macro de salida como primer parámetro, lo que detiene el programa.
El valor de retorno mainse pasa a la exitfunción, que para valores cero, EXIT_SUCCESSo EXIT_FAILUREpuede traducirlo a "una forma definida por la implementación" de terminación exitosa o terminación fallida .
Aparte de 0las macros EXIT_SUCCESSy EXIT_FAILURE, el estándar C no define el significado de los códigos de retorno. Las reglas para el uso de códigos de retorno varían en diferentes plataformas (consulte las secciones específicas de cada plataforma).
DO#
En C# , el Main()método normalmente no devuelve un tipo (su tipo es void, o si async, es System.Threading.Tasks.Task). Sin embargo, Main()puede indicar un tipo de retorno, de tipo int, que se devuelve al sistema operativo. Si el Main()método se declara async, entonces en su lugar devuelve . [ 4 ]System.Threading.Tasks.Task<int>
DOS
En la terminología de DOS, un nivel de error es un código de salida entero devuelto por un programa ejecutable o subrutina . Los niveles de error suelen ir de 0 a 255. [ 5 ] [ 6 ] [ 7 ] [ 8 ] En DOS solo hay 256 códigos de error disponibles, pero DR DOS 6.0 y versiones posteriores admiten códigos de error de 16 bits al menos en CONFIG.SYS . [ 7 ] Con 4DOS y DR-DOS COMMAND.COM , los códigos de salida (en trabajos por lotes) se pueden establecer mediante EXIT n [ 7 ] y (en CONFIG.SYS ) mediante ERROR= n . [ 7 ]
Los estados de salida suelen ser capturados por programas por lotes mediante comandos IF ERRORLEVEL . [ 5 ] [ 7 ] Multiuser DOS admite una variable de entorno reservada %ERRORLVL% que se actualiza automáticamente al regresar de las aplicaciones. COMMAND.COM en DR-DOS 7.02 y versiones posteriores admite una variable de entorno pseudo- similar %ERRORLVL% así como %ERRORLEVEL% . En CONFIG.SYS , DR DOS 6.0 y versiones posteriores admiten ONERROR para probar el estado de carga y el código de retorno de los controladores de dispositivos y el código de salida de los programas. [ 7 ]
Java
En Java , el main()no indica un código de salida, por lo que, si es necesario, se especifica manualmente un código de salida a través de java.lang.System::exit(), lo que finaliza el programa y la JVM. Cualquier método puede llamar a System.exit(), a menos que un administrador de seguridad no lo permita. El argumento sirve como código de estado; por convención, un código de estado distinto de cero indica una terminación anormal. [ 9 ]
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 subcampos: bits de control, número de instalación, número de mensaje y gravedad. Los valores de gravedad se dividen entre éxito (Éxito, Informativo) y fracaso (Advertencia, Error, Fatal). [ 10 ]
Plan 9
En C de Plan 9, el estado de salida se indica mediante una cadena que se pasa a la función exits() , y la función main() es de tipo void .
POSIX
En Unix y otros sistemas compatibles con POSIX , el proceso padre puede recuperar el estado de salida de un proceso hijo utilizando la wait()familia de llamadas al sistema definidas en el encabezado POSIX<wait.h> . [ 11 ] De estas, la llamada waitid()[ 12 ] recupera el estado de salida completo, pero las llamadas más antiguas wait()y waitpid()[ 13 ] recuperan solo los 8 bits menos significativos del estado de salida.
Las wait()interfaces waitpid()establecen un valor de estado de tipo intempaquetado como un campo de bits con varios tipos de información de terminación del hijo. Si el hijo terminó al salir (según lo determine la WIFEXITED()macro; la alternativa habitual es que murió por una señal no capturada ), SUS especifica que los 8 bits de orden inferior del estado de salida se pueden recuperar del valor de estado usando la WEXITSTATUS()macro.
En la waitid()llamada al sistema (añadida con SUSv1), el estado de salida del hijo y otra información ya no están en un campo de bits sino en la estructura de tipo siginfo_t. [ 14 ]
Los sistemas compatibles con POSIX suelen usar la convención de cero para éxito y distinto de cero para error. [ 15 ] Se han desarrollado algunas convenciones sobre los significados relativos de varios códigos de error; por ejemplo, GNU recomienda que los códigos con el bit más significativo activado se reserven para errores graves. [ 3 ]
Los sistemas operativos derivados de BSD han definido un extenso conjunto de interpretaciones preferidas: los significados para 15 códigos de estado del 64 al 78 están definidos en el encabezado POSIX <sysexits.h>. [ 16 ] Históricamente, estos se derivan de sendmail y otros agentes de transferencia de mensajes , pero desde entonces se han utilizado en muchos otros programas. [ 17 ] Se ha descontinuado y se desaconseja su uso. [ 16 ]
La Guía avanzada de scripting de Bash contiene información sobre el significado de los códigos de estado de salida distintos de 0. [ 18 ]
Óxido
En Rust , main()puede devolver cualquier tipo que implemente el rasgo std::process::Termination. [ 19 ]
Internamente, en el entorno de ejecución de Rust, estos valores se devolverán libc::EXIT_SUCCESStanto en caso de ejecución exitosa como libc::EXIT_FAILUREen caso de fallo.
En la biblioteca estándar de Rust, los siguientes tipos tienen implementaciones para std::process::Termination:
!(el tipo nunca )()(el tipo de unidad )std::convert::Infalliablestd::process::ExitCode(con constantesSUCCESSyFAIL)std::result::Result<T, E>
VM/CMS
Windows
Microsoft Windows utiliza enteros sin signo de 32 bits como códigos de salida, [ 21 ] [ 22 ] aunque el intérprete de comandos los trata como si tuvieran signo. [ 23 ]
Los códigos de salida se referencian directamente, por ejemplo, mediante el intérprete de línea de comandos CMD.exe, utilizando la errorlevelterminología heredada de DOS . Los procesos de .NET Framework y Windows PowerShell se refieren a ellos como la ExitCodepropiedad del Processobjeto.
Véase también
Referencias
- ↑ «Niveles de error» . Páginas de secuencias de comandos de Rob van der Woude . Consultado el 26 de agosto de 2007 .
- ↑ "Lenguaje de comandos de shell: estado de salida para los comandos" . The Open Group . Consultado el 7 de julio de 2015 .
- 1 2 "Manual de referencia de la biblioteca C de GNU 25.6.2: Estado de salida" . Gnu.org . Consultado el 9 de julio de 2012 .
- ↑ Microsoft Learn (2026-03-20). "Main() y argumentos de línea de comandos" . learn.microsoft.com . Microsoft Learn.
- ^ Paul, Matías R. (1 de mayo de 1997) [1 de octubre de 1993] . BATTIPs : consejos y trucos para Programmierung von Batchjobs (en alemán). 7: NIVEL DE ERROR aparece. Archivado desde el original el 23 de agosto de 2017 . Consultado el 23 de agosto de 2017 .
{{cite book}}:|work=ignorado ( ayuda )Enlace obsoleto archivado el 11/09/2017 en archive.today (Nota: BATTIPS.TXT forma parte de MPDOSTIP.ZIP. El enlace proporcionado apunta a una versión anterior del archivo BATTIPS.TXT convertida a HTML). - ↑ Auer, Eric; Paul, Matthias R.; Hall, Jim (24-12-2015) [31-12-2003]. "Niveles de error de MS-DOS" . Archivado del original el 24-12-2015.
- ^ Paul, Matías R. (30 de julio de 1997) [ 1 de mayo de 1994 ] . 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 4 de noviembre de 2016 . Consultado el 6 de agosto de 2014 .
{{cite book}}:|work=ignorado ( ayuda ) (Nota: NWDOSTIP.TXT es una obra exhaustiva sobre Novell DOS 7 y OpenDOS 7.01 , que incluye la descripción de muchas características y aspectos internos no documentados. El enlace proporcionado apunta a una versión del archivo convertida a HTML, que forma parte de la colección).MPDOSTIP.ZIP - ↑ Allen, William; Allen, Linda. "Niveles de error de Windows 95/98/ME" . Archivado del original el 7 de julio de 2011.
- ↑ "API de Java 1.6.0" . Sun Microsystems . Consultado el 6 de mayo de 2008 .
- ↑ "Formato OpenVMS de valores de estado de retorno" . H71000.www7.hp.com. Archivado del original el 19 de marzo de 2012. Consultado el 9 de julio de 2012 .
- ↑ – Referencia de definiciones básicas, Especificación única de UNIX , Versión 5 de The Open Group
- ↑ – Referencia de interfaces del sistema, Especificación única de UNIX , Versión 5 de The Open Group
- ↑ – Referencia de interfaces del sistema, Especificación única de UNIX , Versión 5 de The Open Group
- ↑ "2.4.3 Acciones de señalización" . The Open Group . Consultado el 8 de febrero de 2019 .
- ↑ "Capítulo 6. Salida y estado de salida" . Faqs.org . Consultado el 9 de julio de 2012 .
- 1 2 : códigos de salida preferibles para programas – Manual de funciones de la biblioteca de FreeBSD
- ↑ La búsqueda en Google de «"sysexits.h" site:github.com» reporta «Aproximadamente 3.540 resultados»; consultado el 21/02/2013.
- ↑ "Códigos de salida con significados especiales" .
- ↑ El equipo de Rust (25/05/2026). "Terminación en std::process" . doc.rust-lang.org . El equipo de Rust.
- ↑ "Códigos de devolución" . www.ibm.com . Consultado el 27 de marzo de 2026 .
- ↑ "Función ExitProcess" . Consultado el 16 de diciembre de 2016 .
- ↑ "Función GetExitCodeProcess" . Consultado el 22 de abril de 2022 .
- ↑ "¿Es posible que los códigos de salida sean mayores que 255?" . Consultado el 28 de septiembre de 2009 .
- Proceso (informática)