Da dove viene "exit (-1)"?


22

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

Ecco un esempio di una domanda StackOverflow che lo perpetua. Il software "unrealircd" è anche un esempio di un programma che utilizza exit(-1)per terminare il programma. In pratica, ciò rende difficile interfacciarsi con systemd.

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


1
"I sistemi simili a Unix hanno una forte convenzione secondo cui uno stato di uscita pari a 0 indica il successo e qualsiasi stato di uscita diverso da zero indica un fallimento ... Questa convenzione è praticamente cablata nelle shell Unix ..." ( Stato di uscita diverso da zero per uscita pulita )
moscerino

@gnat Secondo il manuale libc lo stato di uscita è esplicitamente compreso tra 0 e 255 inclusi. Se da qualche parte c'è una risposta che afferma che i valori negativi erano validi ad un certo punto, lo accetterei, ma lo trovo altamente dubbio.
user222973

1
@gnat "255" si inserisce facilmente in un unsigned char.
user222973


1
@gnat Un byte in "Java" non è un carattere senza segno, è più equivalente a un charpoiché il suo intervallo di valori è compreso tra -128 e 127. Inoltre, ho già dichiarato che "-1" viene convertito in "255" nel mio corpo di domanda .
user222973

Risposte:


20

Quasi tutti i computer Unix usano il complemento a due per gli interi, e nel complemento a due -1 è sempre "tutti i bit 1" indipendentemente dalla dimensione della parola. Se vuoi il codice di uscita più grande possibile, indipendentemente dalle dimensioni dello stato di uscita del programma, usare -1 e lasciare che la libreria lo tronchi convenientemente fa il trucco.

Questo è utile perché quando gli script o i programmi hanno più di uno stato di uscita possibile (vedi grepper un semplice esempio) quelli significativi sono generalmente assegnati ai numeri più piccoli, rendendo il codice di uscita più grande possibile un buon da usare per "errore sconosciuto" o " abort "poiché è improbabile che entrino mai in conflitto con un valore di stato significativo.


Prendi glibc come esempio, che implementa exit()come status &= 0xff. Esiste una "dimensione della parola" in cui -1 & 0xffnon è 255? Certo che no, perché lo scopo è quello di adattarlo nell'intervallo 0-255. Indipendentemente da ciò, la tua ultima frase non ha senso: i codici di stato 128-255 hanno uno scopo speciale nei sistemi UNIX.
user222973

2
Non confondere i valori di uscita di Bash (che sono 0-127, 128+ sono valori di Bash speciali) con i valori di uscita del programma (che sono 0-255, vedere pubs.opengroup.org/onlinepubs/009695399/functions/exit.html ). Per quanto riguarda le dimensioni, ricorda che i programmatori C hanno avuto a che fare con più dimensioni di parole (originariamente 12, 16 e 32 bit) sin dall'inizio, quindi proviamo automaticamente idiomi che non ci richiedono di considerare la dimensione delle parole. Dato che Unix è precedente a Posix di 2 decenni, non c'è sempre stata la limitazione di 8 bit, quindi abbiamo scritto quindi non importava.
Todd Knarr,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.