Starea de ieșire a unui proces copil în Linux
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.
C
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 %d n ' 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.