Se tiedetään haarukka() järjestelmäkutsua käytetään luomaan uusi prosessi, josta tulee soittajan prosessin lapsi.
Poistuessaan lapsi jättää poistumistilan, joka tulee palauttaa vanhemmalle. Joten kun lapsi lopettaa, siitä tulee a zombie .
Aina kun lapsi poistuu tai pysähtyy, vanhemmalle lähetetään a SIGCHLD signaali.
Vanhempi voi käyttää järjestelmäkutsua wait() tai waitpid() yhdessä makrojen WIFEXITED ja WEXITSTATUS kanssa saadakseen selville pysäytetyn alatason tilan.
(*)wait() järjestelmäkutsu: Se keskeyttää kutsuprosessin suorittamisen, kunnes yksi sen lapsista lopettaa.
Waita()-järjestelmäkutsun syntaksi:
pid_t wait(int *status);
(*)Waitapid()-järjestelmäkutsu: Se keskeyttää kutsuprosessin suorittamisen, kunnes pid-argumentin määrittämä lapsi on vaihtanut tilaa.
Waitpid()-järjestelmäkutsun syntaksi:
pid_t waitpid(pid_t pid int *status int options)
Huomautus: Oletuksena waitpid() odottaa vain lopetettuja lapsia, mutta tätä toimintaa voidaan muokata optionargumentilla, kuten WIFEXITED WEXITSTATUS jne.
Pid:n arvo voi olla:
- Vähemmän kuin -1 : Tarkoittaa, että odota mitä tahansa aliprosessia, jonka prosessiryhmän tunnus on yhtä suuri kuin pid:n absoluuttinen arvo.
- Yhtä kuin -1: Tarkoittaa, että odota mitä tahansa aliprosessia.
- Equal to 0 : Tarkoittaa, että odota mitä tahansa aliprosessia, jonka prosessiryhmän tunnus on sama kuin kutsuvan prosessin.
- Suurempi kuin 0 : Tarkoitus odottaa lasta, jonka prosessitunnus on yhtä suuri kuin pid:n arvo.
WIFEXITED ja WEXITSTATUS ovat kaksi vaihtoehtoa, joiden avulla voidaan tietää lapsen poistumistila.
WIFEXITED(tila) : palauttaa tosi, jos lapsi lopettaa normaalisti.
WEXITSTATUS(tila) : palauttaa lapsen poistumistilan. Tätä makroa tulisi käyttää vain, jos WIFEXITED palautti tosi.
Alla on C-toteutus, jossa lapsi käyttää excl() funktio, mutta execl():lle määritetty polku on määrittelemätön.
Katsotaanpa, mikä on vanhemman saaman lapsen poistumistilan arvo.
// C code to find the exit status of child process #include #include #include #include #include // Driver code int main(void) { pid_t pid = fork(); if ( pid == 0 ) { /* The pathname of the file passed to execl() is not defined */ execl('/bin/sh' 'bin/sh' '-c' './nopath' NULL); } int status; waitpid(pid &status 0); if ( WIFEXITED(status) ) { int exit_status = WEXITSTATUS(status); printf('Exit status of the child was %dn' exit_status); } return 0; }
Lähtö:

Huomautus: Yllä oleva koodi ei välttämättä toimi online-kääntäjän kanssa, koska fork() on poistettu käytöstä.
Tässä poistumistila on 127, mikä osoittaa, että polussa on jokin ongelma tai kirjoitusvirhe.
Muutama poistumistilakoodi on lueteltu alla lisätietojen saamiseksi:
- 1 : Sekalaiset virheet, kuten "jakaa nollalla" ja muut kielletyt toiminnot.
-
2 : Puuttuva avainsana tai komento tai lupaongelma. - 126 : Lupaongelma tai komento ei ole suoritettava
- 128 : virheellinen poistumisargumentti.
Huomautus: C-standardi ei määrittele palautuskoodien merkitystä. Palautuskoodien käyttöä koskevat säännöt vaihtelevat eri alustoilla.