Miért kapok 255-ös hibát, amikor -1-et adok vissza
On február 17, 2021 by admin Új vagyok a C ++ programozásban, és egy nagyon alapvető kérdésem van. Észrevettem, hogy amikor return -1
a C ++ programban, majd ellenőrizze a kilépés állapotát, kapok 255
. Miért van ez?
A kód a legalapvetőbb:
int main() { return -1; }
Ezután a lefordított kód futtatása után:
echo $? 255
Válasz
Mivel a UNIX / POSIX rendszerben egy program kilépési kódját definiálják aláíratlan 8 bites érték. -1-et konvertálva aláíratlan 8-bitesre 255-öt kap.
Szerkesztés a hozzáadáshoz:
További részletekért: a UNIX rendszerhívások wait * () családja kódolja a egyetlen 32 bites egész számgá dolgozzuk fel. Ennek az eredménynek a 32 bitje tovább bontásra kerül, hogy információt nyújtson, például arról, hogy a folyamat egy jel miatt lépett-e ki (és melyik) stb. Ebből a 32 bitből csak 8 van fenntartva a folyamat kilépési kódjára és ezeket aláíratlan értékként értelmezzük.
A UNIX / POSIX fork / exec / wait modellje az egyik legrégebbi és legmélyebben beágyazott szolgáltatás; ha ma új operációs rendszert tervez, akkor mást tehet (legalább 64 bitet használjon :-)).
Másrészt gyakorlatilag valóban hasznos, ha> 255 kilépési kód van? Kétlem. Ha valóban valami erősebbet szeretett volna, akkor azt javasoljuk, hogy váltson “kilépési karakterláncra”, egy szélesebb tartományú numerikus kilépési kód helyett.
Megjegyzések
- Szép szerkesztés. Köszönöm ezt a további információt.
Válasz
Idézés a következőből: bash
man oldal a EXIT STATUS
A végrehajtott parancs kilépési állapota a waitpid rendszerhívás vagy azzal egyenértékű függvény által visszaadott érték. A kilépési állapotok 0 és 255 közé esnek, bár, amint az alábbiakban kifejtésre kerül, a shell speciálisan 125 feletti értékeket használhat. A shell beépítettekből származó kilépési állapotok és az összetett parancsok szintén erre a tartományra korlátozódnak. Bizonyos körülmények között a shell speciális értékeket fog használni a meghibásodási módok megjelölésére.
Tehát ezt a tartományt korlátozza, valójában annyira meglepődtem, mint te vagy.
A waitpid (2)
man oldalról:
WEXITSTATUS(status)
A
visszaadja a gyermek kilépési állapotát. Ez a status argumentum legkevesebb 8 bitjéből áll, amelyet a gyermek a kilépés (3) vagy _exit ( 2) vagy a main () visszatérési utasítás argumentumaként. Ezt a makrót csak akkor szabad használni, ha a WIFEXITED értéke igaz.
Vélemény, hozzászólás?