logo

Stav ukončenia podriadeného procesu v systéme Linux

To je známe vidlička() systémové volanie sa používa na vytvorenie nového procesu, ktorý sa stane potomkom volajúceho procesu. 
Po odchode dieťa opustí stav odchodu, ktorý by sa mal vrátiť rodičovi. Takže keď dieťa skončí, stane sa a zombie .
Kedykoľvek dieťa odíde alebo sa zastaví, rodič je poslaný a SIGCHLD signál. 
Rodič môže použiť systémové volanie wait() alebo waitpid() spolu s makrami WIFEXITED a WEXITSTATUS, aby sa dozvedel o stave svojho zastaveného potomka.
Systémové volanie (*)wait() : Pozastaví vykonávanie procesu volania, kým sa neskončí jeden z jeho potomkov. 
Syntax systémového volania wait(): 

pid_t wait(int *status);


(*)Systémové volanie waitpid(): Pozastaví vykonávanie procesu volania, kým dieťa špecifikované argumentom pid nezmení stav. 
Syntax systémového volania waitpid() : 

pid_t waitpid(pid_t pid int *status int options)


Poznámka: V predvolenom nastavení waitpid() čaká iba na ukončené deti, ale toto správanie je možné upraviť pomocou argumentu options, ako je WIFEXITED WEXITSTATUS atď.
Hodnota pid môže byť: 
 



  1. Menej ako -1 : Znamená čakať na akýkoľvek podradený proces, ktorého ID skupiny procesov sa rovná absolútnej hodnote pid.
  2. Rovná sa -1 : Znamená to čakať na akýkoľvek podradený proces.
  3. Rovná sa 0 : Znamená čakanie na akýkoľvek podriadený proces, ktorého ID skupiny procesov je rovnaké ako ID volajúceho procesu.
  4. Väčšie ako 0 : Znamená čakať na dieťa, ktorého ID procesu sa rovná hodnote pid.


WIFEXITED a WEXITSTATUS sú dve z možností, ktoré možno použiť na zistenie stavu odchodu dieťaťa. 
WIFEXITED(stav) : vráti hodnotu true, ak sa dieťa normálne ukončí.
WEXITSTATUS(stav) : vráti výstupný stav dieťaťa. Toto makro by sa malo použiť iba vtedy, ak WIFEXITED vrátilo hodnotu true.
Nižšie je implementácia C, v ktorej dieťa používa execl() funkcia, ale cesta zadaná pre execl() nie je definovaná. 
Pozrime sa, aká je hodnota stavu ukončenia dieťaťa, ktorú rodič dostane.

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

výstup: 
 

Stav ukončenia podriadeného procesu v systéme Linux
 

Poznámka: Vyššie uvedený kód nemusí fungovať s online kompilátorom, pretože fork() je vypnutá.
Tu je stav ukončenia 127, čo znamená, že existuje nejaký problém s cestou alebo je tam preklep.
Pre ďalšie informácie je nižšie uvedených niekoľko kódov stavu ukončenia: 
 

  • 1 : Rôzne chyby, ako napríklad „delenie nulou“ a iné neprípustné operácie.

  • 2: Chýbajúce kľúčové slovo alebo príkaz alebo problém s povolením.
  • 126: Problém s povolením alebo príkaz nie je spustiteľný súbor
  • 128: neplatný argument na ukončenie.


Poznámka: Štandard C nedefinuje význam návratových kódov. Pravidlá používania návratových kódov sa na rôznych platformách líšia.
 

Vytvoriť kvíz