Varför får jag fel 255 när jag returnerar -1
On februari 17, 2021 by admin Jag är ny i C ++ programmering och jag har en mycket grundläggande fråga. Jag har märkt att när jag returnera -1
i C ++ – programmet och kontrollera sedan utgångsstatus, jag får 255
. Varför är det?
Koden är den mest grundläggande:
int main() { return -1; }
Efter att ha kört den sammanställda koden:
echo $? 255
Svar
Eftersom i UNIX / POSIX definieras utgångskoden för ett program ett osignerat 8-bitarsvärde. Omvandling -1 till osignerad 8-bitars ger 255.
Redigera för att lägga till:
För att ge mer information: vänta * () -familjen med systemanrop i UNIX kodar resultatet av en processen till ett enda 32-bitars heltal. De 32 bitarna av det resultatet bryts vidare upp för att tillhandahålla information såsom huruvida processdumpad kärna, avslutad på grund av en signal (och vilken), etc. Av de 32 bitarna är endast 8 reserverade för utgångskoden för processen och de tolkas som ett osignerat värde.
Gaffel / exec / wait-modellen för UNIX / POSIX är en av dess allra äldsta och djupast inbäddade funktioner; om du designade ett nytt operativsystem idag kan du göra något annorlunda (åtminstone använda 64 bitar :-)).
Å andra sidan är det praktiskt taget verkligen användbart att ha> 255 utgångskoder? Jag tvivlar på det. Om du verkligen ville ha något mer kraftfullt föreslår jag att du byter till en ”exitsträng” istället för en numerisk utgångskod med ett större intervall.
Kommentarer
- Trevlig redigering. Tack för den ytterligare informationen.
Svar
Att citera från bash
mansida på AVSLUTSSTATUS
Utgångsstatus för ett exekverat kommando är det värde som returneras av ventilsystemanropet eller motsvarande funktion. Utgångsstatus faller mellan 0 och 255, men som förklaras nedan kan skalet använda värden över 125 speciellt. Utgångsstatus från inbyggda skal och sammansatta kommandon är också begränsade till detta intervall. Under vissa omständigheter kommer skalet att använda speciella värden för att indikera specifika fellägen.
Så det täcker det till det intervallet, jag är faktiskt så förvånad som du är.
Från waitpid (2)
mansidan:
WEXITSTATUS(status)
returnerar barnets utgångsstatus. Detta består av de minst signifikanta åtta bitarna av statusargumentet som barnet angav i ett samtal för att avsluta (3) eller _exit ( 2) eller som argument för ett returuttalande i main (). Detta makro bör endast användas om WIFEXITED returnerade true.
Lämna ett svar