logo

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: 
 



  1. 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.
  2. Egal cu -1 : Însemnând așteptați orice proces copil.
  3. 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.
  4. 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
// 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: 
 

Starea de ieșire a unui proces copil în Linux
 

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.
 

Creați un test