logo

Status izlaza podređenog procesa u Linuxu

Poznato je da vilica() sistemski poziv se koristi za stvaranje novog procesa koji postaje dijete procesa pozivatelja. 
Po izlasku dijete ostavlja izlazni status koji treba vratiti roditelju. Dakle, kada dijete završi ono postaje a zombi .
Kad god dijete izađe ili se zaustavi, roditelju se šalje a SIGCHLD signal. 
Roditelj može upotrijebiti sistemski poziv wait() ili waitpid() zajedno s makronaredbama WIFEXITED i WEXITSTATUS s njim kako bi saznao o statusu svog zaustavljenog djeteta.
(*)wait() sistemski poziv: obustavlja izvršenje pozivajućeg procesa dok jedno od njegovih potomaka ne završi. 
Sintaksa čekanja() sistemskog poziva: 

pid_t wait(int *status);


(*)Sistemski poziv waitpid(): obustavlja izvršenje procesa pozivanja sve dok dijete navedeno argumentom pid ne promijeni stanje. 
Sintaksa waitpid() sistemskog poziva: 

pid_t waitpid(pid_t pid int *status int options)


Napomena: Prema zadanim postavkama waitpid() čeka samo prekinutu djecu, ali ovo se ponašanje može mijenjati putem argumenta opcija kao što je WIFEXITED WEXITSTATUS itd.
Vrijednost pid-a može biti: 
 



  1. Manje od -1 : Što znači čekati bilo koji podređeni proces čiji je ID grupe procesa jednak apsolutnoj vrijednosti pid-a.
  2. Jednako -1 : Što znači čekati bilo koji podređeni proces.
  3. Jednako 0 : Što znači čekati bilo koji podređeni proces čiji je ID grupe procesa jednak ID-u pozivajućeg procesa.
  4. Veće od 0: znači čekati dijete čiji je ID procesa jednak vrijednosti pid-a.


WIFEXITED i WEXITSTATUS dvije su opcije koje se mogu koristiti za doznavanje izlaznog statusa djeteta. 
WIFEXITED(status) : vraća true ako je dijete normalno završilo.
WEXITSTATUS(status) : vraća izlazni status djeteta. Ovu makronaredbu treba koristiti samo ako je WIFEXITED vratio true.
Ispod je C implementacija u kojoj dijete koristi excl() funkcija, ali staza navedena za execl() je nedefinirana. 
Pogledajmo koja je vrijednost izlaznog statusa djeteta kojeg roditelj dobiva.

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; } 

Izlaz: 
 

Status izlaza podređenog procesa u Linuxu
 

Napomena: Gornji kod možda neće raditi s mrežnim kompajlerom jer je fork() onemogućen.
Ovdje je izlazni status 127 što ukazuje na to da postoji neki problem s putanjom ili da postoji tipfeler.
Za dodatne informacije u nastavku je navedeno nekoliko kodova statusa izlaza: 
 

  • 1 : Razne pogreške kao što je "dijeljenje s nulom" i druge nedopuštene operacije.

  • 2 : Nedostaje ključna riječ ili naredba ili problem s dozvolom.
  • 126 : Problem s dopuštenjem ili naredba nije izvršna
  • 128 : nevažeći argument za izlaz.


Napomena: C standard ne definira značenje povratnih kodova. Pravila za korištenje povratnih kodova razlikuju se na različitim platformama.
 

Napravi kviz