Por que recebo o erro 255 ao retornar -1
On Fevereiro 17, 2021 by admin Sou novo na programação C ++ e tenho uma pergunta muito básica. Percebi isso quando return -1
no programa C ++ e depois verifico o status de saída, obtenho 255
. Por que isso?
O código é o mais básico:
int main() { return -1; }
Então, depois de executar o código compilado:
echo $? 255
Resposta
Porque no UNIX / POSIX, o código de saída de um programa é definido como um valor de 8 bits sem sinal. A conversão de -1 em 8 bits sem sinal dá 255.
Edite 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 ainda divididos para fornecer informações como se o núcleo do processo foi despejado, 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 sem sinal.
O modelo fork / exec / wait do UNIX / POSIX é um de seus recursos mais antigos e profundamente incorporados; se você estivesse projetando um novo sistema operacional hoje, poderia fazer algo diferente (pelo menos usar 64 bits :-)).
Por outro lado, na prática, é realmente útil ter> 255 códigos de saída? Eu duvido. Se você realmente quiser 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 mais amplo.
Comentários
- Boa edição. Obrigado por essas informações adicionais.
Resposta
Para citar bash
página do manual em STATUS DE SAÍDA
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, embora, conforme explicado abaixo, o shell possa usar valores acima de 125 especialmente. Os status de saída de comandos compostos e internos do shell também são limitados a esse intervalo. Sob certas circunstâncias, o shell usará valores especiais para indicar modos de falha específicos.
Portanto, ele limita a essa faixa, estou realmente tão surpreso quanto você é.
Da waitpid (2)
página do manual:
WEXITSTATUS(status)
retorna o status de saída do filho. Isso consiste nos 8 bits menos significativos do argumento de status que o filho especificou em uma chamada para exit (3) ou _exit ( 2) ou como o argumento para uma instrução return em main (). Esta macro só deve ser empregada se WIFEXITED retornar verdadeiro.
Deixe uma resposta