Proč se mi při návratu -1
On 17 února, 2021 by admin dostanu do programování C ++ chyba 255 a mám velmi základní otázku. Všiml jsem si, že když jsem vrátit -1
v programu C ++ a poté zkontrolovat stav ukončení, dostanu 255
. Proč je to tak?
Kód je nejzákladnější:
int main() { return -1; }
Poté, po spuštění zkompilovaného kódu:
echo $? 255
Odpověď
Protože v systému UNIX / POSIX je výstupní kód programu definován jako nepodepsaná 8bitová hodnota. Převod -1 na nepodepsaný 8bitový dá 255.
Upravit a přidat:
Chcete-li uvést více podrobností: rodina systémových volání Wait * () v systému UNIX kóduje výsledek zpracovat do jediného 32bitového celého čísla. Těchto 32 bitů tohoto výsledku je dále rozděleno, aby poskytly informace, jako například to, zda proces vypsal jádro, vystoupilo kvůli signálu (a který z nich) atd. Z těchto 32 bitů je pouze 8 vyhrazeno pro výstupní kód procesu a ty jsou interpretovány jako nepodepsaná hodnota.
Model fork / exec / wait v systému UNIX / POSIX je jednou z jeho nejstarších a nejvíce hluboce zakomponovaných funkcí; pokud byste dnes navrhovali nový operační systém, mohli byste udělat něco jiného (alespoň použít 64 bitů :-)).
Na druhou stranu, prakticky řečeno, je skutečně užitečné mít> 255 kódů ukončení? Pochybuji. Pokud jste opravdu chtěli něco silnějšího, navrhuji vám přepnout na „výstupní řetězec“ namísto číselného výstupního kódu s širším rozsahem.
Komentáře
- Pěkná úprava. Děkujeme za tyto další informace.
Odpověď
Citovat z bash
manuálová stránka na VÝSTAVNÍ STAV
Stav ukončení provedeného příkazu je hodnota vrácená systémovým voláním waitpid nebo ekvivalentní funkcí. Stavy ukončení klesají mezi 0 a 255, ačkoli, jak je vysvětleno níže, prostředí může používat hodnoty nad 125 speciálně. Na tento rozsah jsou také omezeny stavy ukončení z vestavěných prostředí a složených příkazů. Za určitých okolností bude prostředí používat speciální hodnoty k označení konkrétních režimů selhání.
Takže to omezuje na tento rozsah, jsem vlastně stejně překvapený jako jste.
Na waitpid (2)
man stránce:
WEXITSTATUS(status)
vrací návratový stav dítěte. Skládá se z nejméně významných 8 bitů argumentu stavu, které dítě určilo ve volání exit (3) nebo _exit ( 2) nebo jako argument pro návratový příkaz v main (). Toto makro by mělo být použito pouze v případě, že funkce WIFEXITED vrátila hodnotu true.
Napsat komentář