Hvorfor får jeg feil 255 når jeg returnerer -1
On februar 17, 2021 by admin Jeg er ny i C ++ programmering, og jeg har et veldig grunnleggende spørsmål. Jeg har lagt merke til at når jeg returner -1
i C ++ – programmet og sjekk deretter utgangsstatusen, jeg får 255
. Hvorfor er det?
Koden er den mest grunnleggende:
int main() { return -1; }
Deretter, etter å ha kjørt den kompilerte koden:
echo $? 255
Svar
Fordi i UNIX / POSIX er utgangskoden til et program definert til å være en usignert 8-biters verdi. Å konvertere -1 til usignert 8-bit gir 255.
Rediger for å legge til:
For å gi mer detaljer: vent * () -familien med systemanrop i UNIX koder resultatet av en prosess til et enkelt 32-biters heltall. De 32 bitene av dette resultatet blir videre brutt for å gi informasjon som om prosessdumpet kjerne, avsluttet på grunn av et signal (og hvilken), etc. Av de 32 bitene er bare 8 reservert for utgangskoden til prosessen og de tolkes som en usignert verdi.
Gaffel / exec / wait-modellen til UNIX / POSIX er en av de aller eldste og dypest innebygde funksjonene; hvis du skulle designe et nytt operativsystem i dag, kan du gjøre noe annerledes (i det minste bruke 64 bits :-)).
På den annen side er det praktisk sett veldig nyttig å ha> 255 utgangskoder? Det tviler jeg på. Hvis du virkelig ønsket noe kraftigere, foreslår jeg at du bytter til en «exit string», i stedet for en numerisk utgangskode med et bredere område.
Kommentarer
- Fin redigering. Takk for den tilleggsinformasjonen.
Svar
For å sitere fra bash
manside på AVSLUTTSTATUS
Utgangsstatus for en utført kommando er verdien som returneres av ventesystemanrop eller tilsvarende funksjon. Utgangsstatusene faller mellom 0 og 255, men som forklart nedenfor, kan skallet bruke verdier over 125 spesielt. Utgangsstatus fra shell-innebygde og sammensatte kommandoer er også begrenset til dette området. Under visse omstendigheter vil skallet bruke spesielle verdier for å indikere spesifikke feilmodus.
Så det dekker det til det området, jeg er faktisk så overrasket som du er.
Fra waitpid (2)
man-siden:
WEXITSTATUS(status)
returnerer barnets utgangsstatus. Dette består av de minst betydningsfulle 8 bitene av statusargumentet som barnet spesifiserte i et kall for å avslutte (3) eller _exit ( 2) eller som argumentet for en returuttalelse i hoved (). Denne makroen skal bare brukes hvis WIFEXITED returnerte true.
Legg igjen en kommentar