Se stie ca furculiţă() apelul de sistem este folosit pentru a crea un nou proces care devine copil al procesului apelant.
La ieșire copilul părăsește un statut de ieșire care ar trebui returnat părintelui. Deci, când copilul termină, devine a zombie .
Ori de câte ori copilul iese sau se oprește, părintele este trimis a SIGCHLD semnal.
Părintele poate folosi apelul de sistem wait() sau waitpid() împreună cu macrocomenzile WIFEXITED și WEXITSTATUS pentru a afla despre starea copilului său oprit.
Apel de sistem (*)wait() : suspendă execuția procesului de apel până când unul dintre copiii săi se încheie.
Sintaxa apelului de sistem wait():
pid_t wait(int *status);
(*)Apelul de sistem waitpid() : suspendă execuția procesului de apelare până când un copil specificat de argumentul pid își schimbă starea.
Sintaxa apelului de sistem waitpid():
pid_t waitpid(pid_t pid int *status int options)
Notă: În mod implicit, waitpid() așteaptă numai copiii terminați, dar acest comportament este modificabil prin argumentul opțiunilor, cum ar fi WIFEXITED WEXITSTATUS etc.
Valoarea pid poate fi:
- Mai puțin de -1 : Însemnând așteptați pentru orice proces copil al cărui ID grup de procese este egal cu valoarea absolută a pid.
- Egal cu -1 : Însemnând așteptați orice proces copil.
- Egal cu 0 : Însemnând așteptați pentru orice proces copil al cărui ID grup de procese este egal cu cel al procesului apelant.
- Mai mare de 0 : înseamnă așteptați copilul al cărui ID de proces este egal cu valoarea pid.
WIFEXITED și WEXITSTATUS sunt două dintre opțiunile care pot fi folosite pentru a cunoaște starea de ieșire a copilului.
WIFEXITED(stare) : returnează adevărat dacă copilul s-a terminat normal.
WEXITSTATUS(status) : returnează starea de ieșire a copilului. Această macrocomandă ar trebui utilizată numai dacă WIFEXITED a returnat true.
Mai jos este o implementare C în care folosește copilul execl() funcția, dar calea specificată pentru execl() este nedefinită.
Să vedem care este valoarea statutului de ieșire a copilului pe care îl primește părintele.
// 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; }
Ieșire:

Notă: Este posibil ca codul de mai sus să nu funcționeze cu compilatorul online, deoarece fork() este dezactivat.
Aici starea de ieșire este 127, ceea ce indică că există o problemă cu calea sau că există o greșeală de scriere.
Mai jos sunt enumerate câteva coduri de stare de ieșire pentru informații suplimentare:
- 1: erori diverse, cum ar fi „împărțire la zero” și alte operațiuni nepermise.
-
2 : lipsă cuvântul cheie, comandă sau permisiune. - 126: Problema cu permisiunea sau comanda nu este un executabil
- 128 : argument nevalid pentru ieșire.
Notă: Standardul C nu definește semnificația codurilor de returnare. Regulile de utilizare a codurilor de returnare variază pe diferite platforme.