Waarom krijg ik fout 255 als ik -1
Geplaatst op februari 17, 2021 door admin retourneer ik “nieuw in C ++ programmeren en ik heb een heel eenvoudige vraag. Ik heb gemerkt dat toen ik retourneer -1
in C ++ programma en controleer dan de exit-status, ik krijg 255
. Waarom is dat?
De code is de meest elementaire:
int main() { return -1; }
Daarna, na het uitvoeren van de gecompileerde code:
echo $? 255
Answer
Omdat in UNIX / POSIX de exitcode van een programma is gedefinieerd als een niet-ondertekende 8-bits waarde. Het omzetten van -1 naar niet-ondertekende 8-bit geeft 255.
Bewerken om toe te voegen:
Om meer details te geven: de wait * () familie van systeemaanroepen in UNIX coderen het resultaat van een verwerken tot een 32-bits geheel getal. De 32 bits van dat resultaat worden verder opgesplitst om informatie te verschaffen, zoals of het proces de kern heeft gedumpt, verlaten is vanwege een signaal (en welke), enz. Van die 32 bits zijn er slechts 8 gereserveerd voor de exitcode van het proces. en die worden geïnterpreteerd als een niet-ondertekende waarde.
Het fork / exec / wait-model van UNIX / POSIX is een van de oudste en meest diep ingesloten functies; als je vandaag een nieuw besturingssysteem aan het ontwerpen was, zou je iets anders kunnen doen (gebruik tenminste 64 bits :-)).
Aan de andere kant, is het praktisch gezien echt handig om> 255 exitcodes te hebben? Ik betwijfel het. Als je echt iets krachtigers wilde, zou ik “voorstellen dat je” overschakelt naar een “exit-string”, in plaats van een numerieke exitcode met een groter bereik.
Opmerkingen
- Leuke bewerking. Bedankt voor die aanvullende informatie.
Antwoord
Citaat uit bash
man-pagina op VERLAT STATUS
De exitstatus van een uitgevoerde opdracht is de waarde die wordt geretourneerd door de systeemaanroep waitpid of een gelijkwaardige functie. Exit-statussen vallen tussen 0 en 255, maar zoals hieronder wordt uitgelegd, kan de shell speciaal waarden boven 125 gebruiken. Exit-statussen van ingebouwde shell en samengestelde commandos zijn ook beperkt tot dit bereik. Onder bepaalde omstandigheden zal de shell speciale waarden gebruiken om specifieke foutmodi aan te geven.
Dus het sluit het af tot dat bereik, ik ben eigenlijk net zo verrast als dat bent u.
Van de waitpid (2)
man-pagina:
WEXITSTATUS(status)
geeft de exitstatus van het kind terug. Dit bestaat uit de minst significante 8 bits van het statusargument dat het kind specificeerde in een aanroep om exit (3) of _exit ( 2) of als het argument voor een return statement in main (). Deze macro mag alleen gebruikt worden als WIFEXITED true retourneert.
Geef een reactie