Da dove viene "exit (-1)"?

21

Vedo in molti software legacy e cattivi tutorial su Internet che raccomandano di usare exit(-1) , return -1 o simili per rappresentare "terminazione anomala". Il problema è che, almeno in POSIX, -1 non è mai stato e non è un codice di stato valido. man 3 exit illustra che exit() restituisce il valore di status & 0377 al genitore, ovvero che -1 diventa 255 . Sui sistemi non POSIX, è consigliato EXIT_FAILURE per la portabilità. Ma non vedo mai "-1 significa terminazione anomala" in congiunzione con "EXIT_FAILURE può essere qualcosa di diverso da 1", indicando che chiaramente credono che "-1" sia convenzionale anche su sistemi non POSIX.

Ecco un esempio di domanda StackOverflow che perpetua questo. Il software "unrealircd" è anche un esempio di un programma che usa exit(-1) per terminare il programma. In pratica, ciò rende difficile l'interfacciamento con systemd .

Da dove viene questo anti-pattern? È valido in qualche contesto?

    
posta user222973 02.04.2016 - 20:53
fonte

1 risposta

19

Quasi tutti i computer Unix usano il complemento a due per i numeri interi, mentre nel secondo-complemento -1 è sempre "tutti i bit 1" a prescindere dalla dimensione della parola. Se si desidera il codice di uscita più grande possibile indipendentemente dalla dimensione dello stato di uscita del programma, usare -1 e lasciare che la libreria tronca convenientemente fa il trucco.

Questo è utile perché quando script o programmi hanno più di uno stato di uscita possibile (vedi grep per un semplice esempio) quelli significativi sono di solito assegnati ai numeri più piccoli, rendendo il più grande codice di uscita possibile uno buono da usare per "errore sconosciuto" o "interruzione" poiché è improbabile che possa mai entrare in conflitto con un valore di stato significativo.

    
risposta data 02.04.2016 - 22:07
fonte

Leggi altre domande sui tag