Por que recebo o erro 255 ao retornar -1

8

Sou novo em programação C ++ e tenho uma questão muito básica. Eu notei que quando eu retorno -1 no programa C ++ e, em seguida, verifiquei o status de saída, recebo 255 . Por que isso?

O código é o mais básico:

int main()
    {
        return -1;
    }

Depois de executar o código compilado:

echo $?
255
    
por Eugene S 04.05.2012 / 18:34

2 respostas

18

Como no UNIX / POSIX, o código de saída de um programa é definido como um valor de 8 bits sem sinal. Convertendo -1 para unsigned 8-bit dá 255.

Editar para adicionar:

Para dar mais detalhes: a família wait () de chamadas do sistema no UNIX codifica o resultado de um processo em um único inteiro de 32 bits. Os 32 bits desse resultado são divididos para fornecer informações como se o processo despejou o núcleo, saiu devido a um sinal (e qual), etc. Desses 32 bits, apenas 8 estão reservados para o código de saída do processo. e esses são interpretados como um valor não assinado.

O modelo fork / exec / wait do UNIX / POSIX é um dos seus recursos mais antigos e mais profundamente incorporados; Se você estivesse projetando um novo sistema operacional hoje, você pode fazer algo diferente (pelo menos use 64 bits: -)).

Por outro lado, praticamente falando, é realmente útil ter > 255 códigos de saída? Eu duvido. Se você realmente quisesse algo mais poderoso, eu sugeriria que você mudasse para uma "string de saída", em vez de um código de saída numérico com um intervalo maior.

    
por 04.05.2012 / 18:45
7

Para citar a página man bash no STATUS DE SAÍDA

The exit status of an executed command is the value returned by the waitpid system call or equivalent function. Exit statuses fall between 0 and 255, though, as explained below, the shell may use values above 125 specially. Exit statuses from shell builtins and compound commands are also limited to this range. Under certain circumstances, the shell will use special values to indicate specific failure modes.

Por isso, eu fico tão surpreso quanto você.

Na página waitpid (2) man:

WEXITSTATUS(status)

returns the exit status of the child. This consists of the least significant 8 bits of the status argument that the child specified in a call to exit(3) or _exit(2) or as the argument for a return statement in main(). This macro should only be employed if WIFEXITED returned true.

    
por 04.05.2012 / 18:47

Tags