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

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 %d  n  '           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