Znano je, da vilice () sistemski klic se uporablja za ustvarjanje novega procesa, ki postane otrok procesa klicatelja.
Ob izstopu otrok zapusti izhodni status, ki ga je treba vrniti staršu. Torej, ko otrok konča, postane a zombi .
Kadarkoli otrok izstopi ali se ustavi, se staršu pošlje a SIGCHLD signal.
Starš lahko uporabi sistemski klic wait() ali waitpid() skupaj z makroma WIFEXITED in WEXITSTATUS z njim, da izve o statusu svojega ustavljenega otroka.
(*)wait() sistemski klic : Začasno ustavi izvajanje klicnega procesa, dokler eden od njegovih podrejenih elementov ne preneha.
Sintaksa sistemskega klica wait():
pid_t wait(int *status);
(*) Sistemski klic waitpid(): začasno ustavi izvajanje klicnega procesa, dokler otrok, določen z argumentom pid, ne spremeni stanja.
Sintaksa sistemskega klica waitpid():
pid_t waitpid(pid_t pid int *status int options)
Opomba: Privzeto waitpid() čaka samo na prekinjene otroke, vendar je to vedenje mogoče spremeniti z argumentom možnosti, kot je WIFEXITED WEXITSTATUS itd.
Vrednost pid je lahko:
- Manj kot -1 : Pomeni čakanje na kateri koli podrejeni proces, katerega ID skupine procesov je enak absolutni vrednosti pid.
- Enako -1 : Pomeni čakanje na kateri koli podrejeni proces.
- Enako 0 : Pomeni čakanje na kateri koli podrejeni proces, katerega ID skupine procesov je enak ID-ju kličočega procesa.
- Večje od 0: Pomeni čakanje na otroka, katerega ID procesa je enak vrednosti pid.
WIFEXITED in WEXITSTATUS sta dve možnosti, ki ju je mogoče uporabiti za poznavanje izstopnega statusa otroka.
WIFEXITED(status) : vrne true, če je otrok normalno končal.
WEXITSTATUS(status) : vrne izhodni status otroka. Ta makro je treba uporabiti le, če je WIFEXITED vrnil true.
Spodaj je implementacija C, v kateri otrok uporablja excl() vendar je pot, določena za execl(), nedefinirana.
Poglejmo, kakšna je vrednost statusa izhoda otroka, ki ga dobi starš.
// 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; }
Izhod:

Opomba: Zgornja koda morda ne bo delovala s spletnim prevajalnikom, ker je fork() onemogočen.
Tu je stanje izhoda 127, kar pomeni, da obstaja težava s potjo ali da je prišlo do tipkarske napake.
Za dodatne informacije je spodaj navedenih nekaj kod statusa izhoda:
- 1 : Razne napake, kot je 'deljenje z ničlo' in druge nedovoljene operacije.
-
2 : Težava z manjkajočo ključno besedo ali ukazom ali dovoljenjem. - 126 : Težava z dovoljenjem ali ukaz ni izvedljiv
- 128 : neveljaven argument za izhod.
Opomba: standard C ne opredeljuje pomena povratnih kod. Pravila za uporabo povratnih kod se razlikujejo na različnih platformah.