Hvorfor får jeg fejl 255, når jeg returnerer -1
On februar 17, 2021 by admin Jeg er ny i C ++ programmering, og jeg har et meget grundlæggende spørgsmål. Jeg har bemærket, at når jeg returner -1
i C ++ – programmet og kontroller derefter afslutningsstatus, jeg får 255
. Hvorfor er det?
Koden er den mest basale:
int main() { return -1; }
Derefter efter at have kørt den kompilerede kode:
echo $? 255
Svar
Fordi i UNIX / POSIX er udgangskoden for et program defineret til at være en usigneret 8-bit værdi. Konvertering -1 til usigneret 8-bit giver 255.
Rediger for at tilføje:
For at give flere detaljer: ventetiden * () systemopkald i UNIX koder resultatet af en proces til et enkelt 32-bit heltal. De 32 bits af dette resultat opdeles yderligere for at tilvejebringe information, såsom om den procesdumpede kerne, der afsluttes på grund af et signal (og hvilken) osv. Af de 32 bits er kun 8 reserveret til procesens udgangskode og de fortolkes som en usigneret værdi.
Gaffel / exec / wait-modellen til UNIX / POSIX er en af dens meget ældste og dybt indlejrede funktioner; hvis du designer et nyt operativsystem i dag, kan du muligvis gøre noget andet (i det mindste bruge 64 bits :-)).
På den anden side er det praktisk set virkelig nyttigt at have> 255 exit-koder? Det tvivler jeg på. Hvis du virkelig ville have noget mere kraftfuldt, ville jeg foreslå, at du skiftede til en “exit streng” i stedet for en numerisk exit kode med et bredere interval.
Kommentarer
- Dejlig redigering. Tak for disse yderligere oplysninger.
Svar
For at citere fra bash
mandeside på AFSLUTTSTATUS
Afslutningsstatus for en udført kommando er den værdi, der returneres af ventetidssystemopkald eller tilsvarende funktion. Udgangsstatus falder mellem 0 og 255, men som forklaret nedenfor kan skallen bruge værdier over 125 specielt. Udgangsstatus fra shell-indbyggede og sammensatte kommandoer er også begrænset til dette interval. Under visse omstændigheder vil skallen bruge specielle værdier til at angive specifikke fejltilstande.
Så det dækker det til det interval, jeg er faktisk så overrasket som du er.
Fra waitpid (2)
man-siden:
WEXITSTATUS(status)
returnerer barnets udgangsstatus. Dette består af de mindst signifikante 8 bits i statusargumentet, som barnet specificerede i et kald til at afslutte (3) eller _exit ( 2) eller som argumentet for en returnerklæring i main (). Denne makro skal kun anvendes, hvis WIFEXITED returnerede true.
Skriv et svar