Miksi saan virheen 255, kun palautan -1
On helmikuu 17, 2021 by admin Olen uusi C ++ -ohjelmointiin ja minulla on hyvin perustava kysymys. Olen huomannut, että kun palauta -1
C ++ -ohjelmassa ja tarkista sitten poistumistila, saan 255
. Miksi se on?
Koodi on yksinkertaisin:
int main() { return -1; }
Sitten käännetyn koodin suorittamisen jälkeen:
echo $? 255
vastaus
Koska UNIX / POSIX-ohjelmassa ohjelman poistumistunnus on määritelty allekirjoittamaton 8-bittinen arvo. Muunna -1 allekirjoittamattomaksi 8-bittiseksi saadaan 255.
Lisää ja lisää muokkaamalla:
Yksityiskohtaisemmin: UNIX: n järjestelmäkutsujen perhe * wait * () koodaa tuloksen prosessoida yhdeksi 32-bittiseksi kokonaisluvuksi. Tuloksen 32 bittiä hajotetaan edelleen antamaan tietoja, kuten se, onko prosessi tyhjennetty ydin, poistui signaalista (ja kumpi) jne. Jne. Näistä 32 bitistä vain 8 on varattu prosessin poistumiskoodille ja ne tulkitaan allekirjoittamattomaksi arvoksi.
UNIX / POSIXin fork / exec / wait-malli on yksi sen vanhimmista ja syvimmälle upotetuista ominaisuuksista; Jos suunnittelet uutta käyttöjärjestelmää tänään, saatat tehdä jotain erilaista (käytä ainakin 64 bittiä :-)).
Toisaalta, onko käytännöllisesti katsoen hyödyllistä, että sinulla on> 255 poistumiskoodia? Epäilen sitä. Jos todella halusit jotain tehokkaampaa, suosittelen, että vaihdat ”poistumismerkkijonoon” laajemman numeerisen poistumiskoodin sijaan.
Kommentit
- Mukava muokkaus. Kiitos lisätiedoista.
Vastaa
Lainattaessa bash
man sivu POISTU TILA
Suoritetun komennon poistumistila on arvo, jonka palauttaa waitpid-järjestelmän kutsu tai vastaava toiminto. Poistumistilat ovat välillä 0 ja 255, vaikka, kuten alla selitetään, kuori voi käyttää arvoja yli 125. Shell-sisäänrakennusten poistumistilat ja yhdistetyt komennot ovat myös rajoitettu tähän alueeseen. Tietyissä olosuhteissa kuori käyttää erityisiä arvoja osoittamaan tiettyjä vikatiloja.
Joten se rajoittaa sen tälle alueelle, olen itse asiassa yhtä yllättynyt kuin olet.
waitpid (2)
-sivulta:
WEXITSTATUS(status)
palauttaa lapsen poistumistilan. Tämä koostuu vähiten merkitsevistä 8 bitistä tila-argumentista, jonka lapsi määritteli poistumispyynnössä (3) tai _exit ( 2) tai argumenttina palautuslausekkeelle main (): ssa. Tätä makroa tulisi käyttää vain, jos WIFEXITED palautti arvon true.
Vastaa