Skip to content
Tiantan
Articles

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.

Written by admin

Napsat komentář Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Nejnovější příspěvky

  • Pomocí balunu s rezonančním dipólem
  • Jaký je rozdíl mezi “ nelze ” a “ ”? [duplicate]
  • Můžete se na JFK pohybovat mezi terminály mimo letiště na vnitrostátních letech?
  • “ Hluboce ceněný ” nebo “ velmi ceněn ”
  • Co ' abstraktní myšlenky ' znamenají? [uzavřeno]

Archivy

  • Únor 2021
  • Leden 2021
  • Prosinec 2020
  • Listopad 2020
  • Deutsch
  • Nederlands
  • Svenska
  • Norsk
  • Dansk
  • Español
  • Français
  • Português
  • Italiano
  • Română
  • Polski
  • Čeština
  • Magyar
  • Suomi
  • 日本語
  • 한국어

Copyright Tiantan 2021 | Theme by Theme in Progress | Proudly powered by WordPress

Back to top