logo

Stav ukončení podřízeného procesu v Linuxu

To se ví vidlice() systémové volání se používá k vytvoření nového procesu, který se stane potomkem volajícího procesu. 
Po ukončení dítě opustí stav ukončení, který by měl být vrácen rodiči. Takže když dítě skončí, stane se z něj a zombie .
Kdykoli dítě odejde nebo se zastaví, rodič je odeslán a SIGCHLD signál. 
Rodič může použít systémové volání wait() nebo waitpid() spolu s makry WIFEXITED a WEXITSTATUS, aby se dozvěděl o stavu svého zastaveného potomka.
Systémové volání (*)wait() : Pozastaví provádění volajícího procesu, dokud jeden z jeho potomků neskončí. 
Syntaxe systémového volání wait(): 

pid_t wait(int *status);


(*)Systémové volání waitpid() : Pozastaví provádění volajícího procesu, dokud dítě zadané argumentem pid nezmění stav. 
Syntaxe systémového volání waitpid() : 

pid_t waitpid(pid_t pid int *status int options)


Poznámka: Ve výchozím nastavení čeká waitpid() pouze na ukončené děti, ale toto chování lze upravit pomocí argumentu options, jako je WIFEXITED WEXITSTATUS atd.
Hodnota pid může být: 
 



  1. Méně než -1 : Znamená čekání na jakýkoli podřízený proces, jehož ID skupiny procesů se rovná absolutní hodnotě pid.
  2. Rovná se -1 : To znamená čekat na jakýkoli podřízený proces.
  3. Rovná se 0 : Znamená čekání na jakýkoli podřízený proces, jehož ID skupiny procesů je stejné jako ID volajícího procesu.
  4. Větší než 0 : Znamená čekání na potomka, jehož ID procesu se rovná hodnotě pid.


WIFEXITED a WEXITSTATUS jsou dvě z možností, které lze použít ke zjištění stavu odchodu dítěte. 
WIFEXITED(stav) : vrátí hodnotu true, pokud se dítě normálně ukončí.
WEXITSTATUS(status) : vrací výstupní stav potomka. Toto makro by mělo být použito pouze v případě, že WIFEXITED vrátilo hodnotu true.
Níže je implementace C, ve které dítě používá execl() funkce, ale cesta určená pro execl() není definována. 
Podívejme se, jaká je hodnota výstupního stavu potomka, který rodič získá.

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čení podřízeného procesu v Linuxu
 

Poznámka: Výše uvedený kód nemusí fungovat s online kompilátorem, protože fork() je zakázáno.
Zde je výstupní stav 127, což znamená, že došlo k problému s cestou nebo došlo k překlepu.
Pro další informace je níže uvedeno několik kódů stavu ukončení: 
 

  • 1 : Různé chyby jako „dělení nulou“ a další nepřípustné operace.

  • 2 : Chybějící klíčové slovo nebo příkaz nebo problém s oprávněním.
  • 126: Problém s oprávněním nebo příkaz není spustitelný soubor
  • 128: neplatný argument pro ukončení.


Poznámka: Standard C nedefinuje význam návratových kódů. Pravidla pro použití návratových kódů se na různých platformách liší.
 

Vytvořit kvíz