Por que recebo o erro 255 ao retornar -1

10

Eu sou novo em programação C ++ e tenho uma pergunta muito básica. Percebi que, quando volto -1no programa C ++ e, em seguida, verifico o status de saída, recebo 255. Por que é que?

O código é o mais básico:

int main()
    {
        return -1;
    }

Depois de executar o código compilado:

echo $?
255
Eugene S
fonte

Respostas:

24

Como no UNIX / POSIX, o código de saída de um programa é definido como um valor de 8 bits não assinado. A conversão de -1 em 8 bits não assinados fornece 255.

Edite para adicionar:

Para fornecer mais detalhes: a família de chamadas wait * () do sistema no UNIX codifica o resultado de um processo em um único inteiro de 32 bits. Os 32 bits desse resultado são desmembrados 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 sã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 recursos mais antigos e profundamente incorporados; se você estava projetando um novo sistema operacional hoje, pode fazer algo diferente (pelo menos use 64 bits :-)).

Por outro lado, na prática, é realmente útil ter> 255 códigos de saída? Eu duvido. Se você realmente deseja algo mais poderoso, sugiro que você mude para uma "string de saída", em vez de um código de saída numérico com um intervalo maior.

Cientista maluco
fonte
Boa edição. Obrigado por essa informação adicional.
George M
7

Para citar a partir da bashpágina de manual no EXIT STATUS

O status de saída de um comando executado é o valor retornado pela chamada do sistema waitpid ou função equivalente. Os status de saída ficam entre 0 e 255; no entanto, conforme explicado abaixo, o shell pode usar valores acima de 125 especialmente. Os status de saída dos componentes internos do shell e comandos compostos também são limitados a esse intervalo. Sob certas circunstâncias, o shell usará valores especiais para indicar modos de falha específicos.

Então, isso é limitado a esse intervalo, estou realmente tão surpreso quanto você.

Na waitpid (2)página do manual:

WEXITSTATUS(status)

retorna o status de saída da criança. Isso consiste nos 8 bits menos significativos do argumento status que o filho especificou em uma chamada para exit (3) ou _exit (2) ou como argumento para uma declaração de retorno em main (). Essa macro só deve ser empregada se WIFEXITED retornado verdadeiro.

sombrio
fonte