Köztudott, hogy villa() A rendszerhívás egy új folyamat létrehozására szolgál, amely a hívó folyamat gyermekévé válik.
Kilépéskor a gyermek kilépési állapotot hagy, amelyet vissza kell adni a szülőnek. Tehát amikor a gyermek befejezi, a zombi .
Amikor a gyermek kilép vagy megáll, a szülő elküldi a SIGCHLD jel.
A szülő használhatja a wait() vagy a waitpid() rendszerhívást a WIFEXITED és WEXITSTATUS makróval együtt, hogy megismerje leállított gyermek állapotát.
(*)wait() rendszerhívás: Felfüggeszti a hívási folyamat végrehajtását, amíg az egyik gyermeke meg nem szakad.
A wait() rendszerhívás szintaxisa:
pid_t wait(int *status);
(*)A waitpid() rendszerhívás: Felfüggeszti a hívási folyamat végrehajtását mindaddig, amíg a pid argumentum által meghatározott gyermek állapota meg nem változik.
A waitpid() rendszerhívás szintaxisa:
pid_t waitpid(pid_t pid int *status int options)
Megjegyzés: Alapértelmezés szerint a waitpid() csak a befejezett gyermekekre vár, de ez a viselkedés módosítható az opciók argumentumával, például WIFEXITED WEXITSTATUS stb.
A pid értéke lehet:
- Kevesebb, mint -1 : Azt jelenti, hogy várjon minden olyan gyermekfolyamatra, amelynek folyamatcsoport-azonosítója megegyezik a pid abszolút értékével.
- Egyenlő -1: Azt jelenti, hogy várni kell minden gyermek folyamatra.
- Egyenlő 0: Jelentése, hogy várjon minden olyan utód folyamatra, amelynek folyamatcsoport-azonosítója megegyezik a hívó folyamat azonosítójával.
- 0-nál nagyobb : Azt jelenti, hogy várni kell a gyermekre, akinek a folyamatazonosítója megegyezik a pid értékével.
A WIFEXITED és a WEXITSTATUS két olyan lehetőség, amelyek segítségével megtudhatja a gyermek kilépési állapotát.
WIFEXITED(állapot) : igazat ad vissza, ha a gyermek normálisan fejezte be.
WEXITSTATUS(állapot) : a gyermek kilépési állapotát adja vissza. Ezt a makrót csak akkor szabad használni, ha a WIFEXITED értéke igaz.
Az alábbiakban egy C megvalósítás látható, amelyben a gyermek használja excl() függvényt, de az execl() függvényben megadott elérési út nincs definiálva.
Nézzük meg, mi a kilépési állapot értéke annak a gyermeknek, amelyet a szülő kap.
// 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; }
Kimenet:

Megjegyzés: Előfordulhat, hogy a fenti kód nem működik online fordítóval, mivel a fork() le van tiltva.
Itt a kilépési állapot 127, ami azt jelzi, hogy probléma van az elérési úttal, vagy elírás van.
Az alábbiakban néhány kilépési állapotkód található további információként:
- 1 : Különféle hibák, mint például az „osztás nullával” és egyéb meg nem engedett műveletek.
-
2 : Hiányzó kulcsszó vagy parancs vagy engedély probléma. - 126 : Az engedélyprobléma vagy a parancs nem végrehajtható
- 128 : érvénytelen argumentum a kilépéshez.
Megjegyzés: A C szabvány nem határozza meg a visszatérési kódok jelentését. A visszatérési kódok használatára vonatkozó szabályok a különböző platformokon eltérőek.