Eu vejo em um monte de software legado e maus tutoriais na Internet que recomendo o uso exit(-1)
, return -1
ou similar para representar "finalização anormal". O problema é que, pelo menos no POSIX, -1
nunca foi e não é um código de status válido. man 3 exit
ilustra que exit()
retorna o valor de status & 0377
para o pai, o que significa que ele -1
se torna 255
. Em sistemas não POSIX, EXIT_FAILURE
é recomendado para portabilidade. Mas nunca vejo "-1 significa rescisão anormal" em conjunto com "EXIT_FAILURE pode ser algo diferente de 1", indicando que eles acreditam claramente que "-1" é convencional, mesmo em sistemas não POSIX.
Aqui está um exemplo de uma pergunta StackOverflow que perpetua isso. O software "unrealircd" também é um exemplo de programa usado exit(-1)
para finalizar o programa. Na prática, isso dificulta a interface systemd
.
De onde veio esse anti-padrão? É válido em algum contexto?
fonte
unsigned char
.char
pois seu intervalo de valores é -128 a 127. Além disso, eu já afirmei que "-1" é convertido em "255" no corpo da minha pergunta .Respostas:
Quase todos os computadores Unix usam complemento duplo para números inteiros, e no complemento duplo -1 é sempre "todos os bits 1", independentemente do tamanho da palavra. Se você deseja o maior código de saída possível, independentemente do tamanho do status de saída do programa, use -1 e deixe a biblioteca truncá-lo convenientemente.
Isso é útil porque, quando scripts ou programas têm mais de um status de saída possível (veja
grep
um exemplo simples), os significativos são geralmente atribuídos aos menores números, tornando o maior código de saída possível um bom para "erro desconhecido" ou " abortar ", pois é improvável que entre em conflito com um valor de status significativo.fonte
exit()
comostatus &= 0xff
. Existe um "tamanho de palavra" no qual-1 & 0xff
não é 255? Claro que não, porque o objetivo é ajustá-lo no intervalo de 0 a 255. Independentemente disso, sua última frase não faz sentido: os códigos de status 128-255 têm um propósito especial nos sistemas UNIX.