¿Por qué obtengo el error 255 cuando devuelvo -1
On febrero 17, 2021 by admin Soy nuevo en la programación de C ++ y tengo una pregunta muy básica. Me di cuenta de eso cuando return -1
en el programa C ++ y luego verifico el estado de salida, obtengo 255
. ¿Por qué?
El código es el más básico:
int main() { return -1; }
Luego, después de ejecutar el código compilado:
echo $? 255
Respuesta
Porque en UNIX / POSIX, el código de salida de un programa se define como un valor de 8 bits sin signo. Convertir -1 a 8 bits sin firmar da 255.
Editar para agregar:
Para dar más detalles: la familia de llamadas al sistema wait * () en UNIX codifica el resultado de una procesar en un solo entero de 32 bits. Los 32 bits de ese resultado se dividen aún más para proporcionar información como si el proceso abandonó el núcleo, salió debido a una señal (y cuál), etc. De esos 32 bits, solo 8 están reservados para el código de salida del proceso. y esos se interpretan como un valor sin firmar.
El modelo fork / exec / wait de UNIX / POSIX es una de sus características más antiguas y profundamente incrustadas; si estuviera diseñando un nuevo sistema operativo hoy, podría hacer algo diferente (al menos usar 64 bits :-)).
Por otro lado, prácticamente hablando, ¿es realmente útil tener> 255 códigos de salida? Lo dudo. Si realmente desea algo más poderoso, le sugiero que cambie a una «cadena de salida», en lugar de un código de salida numérico con un rango más amplio.
Comentarios
- Buena edición. Gracias por esa información adicional.
Respuesta
Para citar bash
página de manual en ESTADO DE SALIDA
El estado de salida de un comando ejecutado es el valor devuelto por la llamada al sistema waitpid o una función equivalente. Los estados de salida se encuentran entre 0 y 255, aunque, como se explica a continuación, el shell puede usar valores superiores a 125 especialmente. Los estados de salida de los comandos integrados de shell y los comandos compuestos también se limitan a este rango. Bajo ciertas circunstancias, el shell usará valores especiales para indicar modos de falla específicos.
Así que lo limita a ese rango, en realidad estoy tan sorprendido como usted es.
Desde la waitpid (2)
página de manual:
WEXITSTATUS(status)
devuelve el estado de salida del niño. Este consiste en los 8 bits menos significativos del argumento de estado que el niño especificó en una llamada a exit (3) o _exit ( 2) o como argumento para una declaración de retorno en main (). Esta macro solo debe emplearse si WIFEXITED devolvió verdadero.
Deja una respuesta