De ce primesc eroarea 255 când returnez -1
On februarie 17, 2021 by admin Sunt nou în programarea C ++ și am o întrebare foarte de bază. Am observat asta când returnează -1
în programul C ++ și apoi verific starea de ieșire, primesc 255
. De ce este asta?
Codul este cel mai de bază:
int main() { return -1; }
Apoi, după executarea codului compilat:
echo $? 255
Răspuns
Deoarece în UNIX / POSIX, codul de ieșire al unui program este definit ca fiind o valoare de 8 biți nesemnată. Conversia -1 în 8 biți nesemnați dă 255.
Editați pentru a adăuga:
Pentru a oferi mai multe detalii: familia wait * () de apeluri de sistem din UNIX codifică rezultatul unui proces într-un singur număr întreg de 32 de biți. Cei 32 de biți ai acelui rezultat sunt divizați în continuare pentru a furniza informații, cum ar fi dacă procesul a aruncat nucleul, a ieșit din cauza unui semnal (și care), etc. Din acei 32 de biți, doar 8 sunt rezervați pentru codul de ieșire al procesului iar acestea sunt interpretate ca o valoare nesemnată.
Modelul fork / exec / wait al UNIX / POSIX este una dintre caracteristicile sale cele mai vechi și cele mai încorporate; dacă proiectați un nou sistem de operare astăzi, ați putea face ceva diferit (cel puțin utilizați 64 de biți :-)).
Pe de altă parte, practic vorbind este cu adevărat util să aveți> 255 de coduri de ieșire? Mă îndoiesc de asta. Dacă vrei cu adevărat ceva mai puternic, îți sugerez să treci la un „șir de ieșire”, în loc de un cod de ieșire numeric cu o gamă mai largă.
Comentarii
- Modificare frumoasă. Vă mulțumim pentru acele informații suplimentare.
Răspuns
Pentru a cita din bash
pagina man pe EXIT STATUS
Starea de ieșire a unei comenzi executate este valoarea returnată de apelul de sistem waitpid sau funcția echivalentă. Stările de ieșire se situează între 0 și 255, deși, așa cum se explică mai jos, shell-ul poate folosi valori mai mari de 125 special. Stările de ieșire din shell builtins și comenzile compuse sunt, de asemenea, limitate la acest interval. În anumite circumstanțe, shell-ul va folosi valori speciale pentru a indica moduri de eșec specifice.
Deci, îl plafonează la acel interval, de fapt sunt la fel de surprins ca sunteți.
Din pagina de manual waitpid (2)
:
WEXITSTATUS(status)
returnează starea de ieșire a copilului. Acesta constă din cei mai puțin semnificativi 8 biți ai argumentului de stare pe care copilul i-a specificat într-un apel pentru a ieși (3) sau _exit ( 2) sau ca argument pentru o declarație de returnare în main (). Această macrocomandă ar trebui utilizată numai dacă WIFEXITED a returnat adevărat.
Lasă un răspuns