Veo en una gran cantidad de software heredado y malos tutoriales en Internet que recomiendan usar exit(-1)
, return -1
o similar, para representar la "terminación anormal". El problema es que, al menos en POSIX, -1
nunca ha sido y no es un código de estado válido. man 3 exit
ilustra que exit()
devuelve el valor de status & 0377
al padre, lo que significa que se -1
convierte en 255
. En sistemas que no son POSIX, EXIT_FAILURE
se recomienda para la portabilidad. Pero nunca veo "-1 significa terminación anormal" junto con "EXIT_FAILURE puede ser algo distinto de 1", lo que indica que creen claramente que "-1" es convencional incluso en sistemas que no son POSIX.
Aquí hay un ejemplo de una pregunta de StackOverflow que perpetúa esto. El software "no realircd" también es un ejemplo de un programa que se utiliza exit(-1)
para finalizar el programa. En la práctica, esto dificulta la interacción con ellos systemd
.
¿De dónde vino este antipatrón? ¿Es válido en algún contexto?
fuente
unsigned char
.char
ya que su rango de valores es -128 a 127. Además, ya dije "-1" se convierte en "255" en mi cuerpo de preguntas .Respuestas:
Casi todas las computadoras Unix usan dos-complemento para enteros, y en dos-complemento -1 siempre es "todos los bits 1" independientemente del tamaño de la palabra. Si desea el código de salida más grande posible, independientemente del tamaño del estado de salida del programa, usar -1 y dejar que la biblioteca se trunca convenientemente hace el truco.
Eso es útil porque cuando los scripts o programas tienen más de un estado de salida posible (ver
grep
un ejemplo simple), los más significativos generalmente se asignan a los números más pequeños, lo que hace que el código de salida más grande sea bueno para "error desconocido" o " abortar ", ya que es poco probable que entre en conflicto con un valor de estado significativo.fuente
exit()
comostatus &= 0xff
. ¿Hay un "tamaño de palabra" en el que-1 & 0xff
no sea 255? Por supuesto que no, porque todo el propósito es hacerlo encajar en el rango de 0-255. De todos modos, su última oración no tiene sentido: los códigos de estado 128-255 tienen un propósito especial en los sistemas UNIX.