Perché viene visualizzato l'errore 255 quando si restituisce -1


10

Sono nuovo nella programmazione C ++ e ho una domanda molto semplice. Ho notato che quando torno -1nel programma C ++ e quindi controllo lo stato di uscita, ottengo 255. Perché?

Il codice è il più semplice:

int main()
    {
        return -1;
    }

Quindi, dopo aver eseguito il codice compilato:

echo $?
255

Risposte:


24

Perché in UNIX / POSIX, il codice di uscita di un programma è definito come un valore a 8 bit senza segno. La conversione di -1 in 8 bit senza segno dà 255.

Modifica per aggiungere:

Per fornire maggiori dettagli: la famiglia wait * () delle chiamate di sistema in UNIX codifica il risultato di un processo in un singolo numero intero a 32 bit. I 32 bit di quel risultato sono ulteriormente suddivisi per fornire informazioni come se il processo ha scaricato il core, uscito a causa di un segnale (e quale), ecc. Di quei 32 bit, solo 8 sono riservati per il codice di uscita del processo e quelli sono interpretati come un valore senza segno.

Il modello fork / exec / wait di UNIX / POSIX è una delle sue funzionalità più antiche e profondamente integrate; se stavi progettando un nuovo sistema operativo oggi potresti fare qualcosa di diverso (almeno usa 64 bit :-)).

D'altra parte, praticamente parlando è davvero utile avere> 255 codici di uscita? Ne dubito. Se davvero volessi qualcosa di più potente, ti suggerirei di passare a una "stringa di uscita", anziché a un codice di uscita numerico con un intervallo più ampio.


Bella modifica. Grazie per quelle informazioni aggiuntive.
George M,

7

Per citare dalla bashpagina man su EXIT STATUS

Lo stato di uscita di un comando eseguito è il valore restituito dalla chiamata di sistema waitpid o da una funzione equivalente. Gli stati di uscita sono compresi tra 0 e 255, anche se, come spiegato di seguito, la shell può utilizzare valori superiori a 125 appositamente. Anche gli stati di uscita dai comandi incorporati della shell e i comandi composti sono limitati a questo intervallo. In determinate circostanze, la shell utilizzerà valori speciali per indicare specifiche modalità di errore.

Quindi lo supera a quell'intervallo, in realtà sono sorpreso quanto te.

Dalla waitpid (2)pagina man:

WEXITSTATUS(status)

restituisce lo stato di uscita del bambino. Questo è costituito dagli 8 bit meno significativi dell'argomento status che il figlio ha specificato in una chiamata a exit (3) o _exit (2) o come argomento per un'istruzione return in main (). Questa macro deve essere utilizzata solo se WIFEXITED ha restituito true.

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.