Perché ricevo lerrore 255 quando restituisco -1
Su Febbraio 17, 2021 da admin Sono nuovo nella programmazione C ++ e ho una domanda molto semplice. Lho notato quando ho ritorno -1
nel programma C ++ e poi 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
Risposta
Poiché in UNIX / POSIX, il codice di uscita di un programma è definito come un valore a 8 bit senza segno. La conversione da -1 a 8 bit senza segno dà 255.
Modifica per aggiungere:
Per fornire maggiori dettagli: la famiglia di chiamate di sistema wait * () in UNIX codifica il risultato di un processo in un singolo intero a 32 bit. I 32 bit di quel risultato vengono ulteriormente suddivisi per fornire informazioni come se il processo ha eseguito il dump del core, è uscito a causa di un segnale (e quale), ecc. Di questi 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 caratteristiche più antiche e più profondamente integrate; se oggi progettassi un nuovo sistema operativo potresti fare qualcosa di diverso (usa almeno 64 bit :-)).
Daltra parte, in pratica è davvero utile avere> 255 codici di uscita? Ne dubito. Se vuoi davvero qualcosa di più potente, ti suggerisco di “passare a una” stringa di uscita “, invece di un codice di uscita numerico con un intervallo più ampio.
Commenti
- Bella modifica. Grazie per queste informazioni aggiuntive.
Risposta
Per citare da bash
su STATO DI USCITA
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, tuttavia, come spiegato di seguito, la shell può utilizzare appositamente valori superiori a 125. Anche gli stati di uscita dai comandi incorporati della shell e dai comandi composti sono limitati a questo intervallo. In determinate circostanze, la shell utilizzerà valori speciali per indicare modalità di errore specifiche.
Quindi lo limita a tale intervallo, “in realtà sono sorpreso quanto lo sei.
Dalla pagina man waitpid (2)
:
WEXITSTATUS(status)
restituisce lo stato di uscita del figlio. Questo è costituito dagli 8 bit meno significativi dellargomento di stato che il figlio ha specificato in una chiamata a exit (3) o _exit ( 2) o come argomento per unistruzione return in main (). Questa macro dovrebbe essere utilizzata solo se WIFEXITED ha restituito true.
Lascia un commento