¿Por qué recibo el error 255 cuando devuelvo -1

10

Soy nuevo en la programación de C ++ y tengo una pregunta muy básica. Me di cuenta de que cuando regreso -1en el programa C ++ y luego verifico el estado de salida, aparece 255. ¿Porqué es eso?

El código es el más básico:

int main()
    {
        return -1;
    }

Luego, después de ejecutar el código compilado:

echo $?
255
Eugene S
fuente

Respuestas:

24

Porque en UNIX / POSIX, el código de salida de un programa se define como un valor de 8 bits sin signo. La conversión de -1 a 8 bits sin signo da 255.

Editar para agregar:

Para dar más detalles: la familia wait * () de llamadas al sistema en UNIX codifica el resultado de un proceso 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 descargó 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 signo.

El modelo fork / exec / wait de UNIX / POSIX es una de sus características más antiguas y más profundamente integradas; Si estuviera diseñando un nuevo sistema operativo hoy, podría hacer algo diferente (al menos usar 64 bits :-)).

Por otro lado, en términos prácticos, ¿es realmente útil tener> 255 códigos de salida? Lo dudo. Si realmente quisiera 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.

Científico loco
fuente
Buena edición. Gracias por esa información adicional.
George M
7

Para citar de la bashpágina man 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 caen 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 tú.

Desde la waitpid (2)página del manual:

WEXITSTATUS(status)

devuelve el estado de salida del niño. Consiste en los 8 bits menos significativos del argumento de estado que el hijo especificó en una llamada a exit (3) o _exit (2) o como argumento para una declaración return en main (). Esta macro solo debe emplearse si WIFEXITED devuelve verdadero.

utopía
fuente