logo

Egy gyermekfolyamat kilépési állapota Linuxban

Köztudott, hogy villa() A rendszerhívás egy új folyamat létrehozására szolgál, amely a hívó folyamat gyermekévé válik. 
Kilépéskor a gyermek kilépési állapotot hagy, amelyet vissza kell adni a szülőnek. Tehát amikor a gyermek befejezi, a zombi .
Amikor a gyermek kilép vagy megáll, a szülő elküldi a SIGCHLD jel. 
A szülő használhatja a wait() vagy a waitpid() rendszerhívást a WIFEXITED és WEXITSTATUS makróval együtt, hogy megismerje leállított gyermek állapotát.
(*)wait() rendszerhívás: Felfüggeszti a hívási folyamat végrehajtását, amíg az egyik gyermeke meg nem szakad. 
A wait() rendszerhívás szintaxisa: 

pid_t wait(int *status);


(*)A waitpid() rendszerhívás: Felfüggeszti a hívási folyamat végrehajtását mindaddig, amíg a pid argumentum által meghatározott gyermek állapota meg nem változik. 
A waitpid() rendszerhívás szintaxisa: 

pid_t waitpid(pid_t pid int *status int options)


Megjegyzés: Alapértelmezés szerint a waitpid() csak a befejezett gyermekekre vár, de ez a viselkedés módosítható az opciók argumentumával, például WIFEXITED WEXITSTATUS stb.
A pid értéke lehet: 
 



  1. Kevesebb, mint -1 : Azt jelenti, hogy várjon minden olyan gyermekfolyamatra, amelynek folyamatcsoport-azonosítója megegyezik a pid abszolút értékével.
  2. Egyenlő -1: Azt jelenti, hogy várni kell minden gyermek folyamatra.
  3. Egyenlő 0: Jelentése, hogy várjon minden olyan utód folyamatra, amelynek folyamatcsoport-azonosítója megegyezik a hívó folyamat azonosítójával.
  4. 0-nál nagyobb : Azt jelenti, hogy várni kell a gyermekre, akinek a folyamatazonosítója megegyezik a pid értékével.


A WIFEXITED és a WEXITSTATUS két olyan lehetőség, amelyek segítségével megtudhatja a gyermek kilépési állapotát. 
WIFEXITED(állapot) : igazat ad vissza, ha a gyermek normálisan fejezte be.
WEXITSTATUS(állapot) : a gyermek kilépési állapotát adja vissza. Ezt a makrót csak akkor szabad használni, ha a WIFEXITED értéke igaz.
Az alábbiakban egy C megvalósítás látható, amelyben a gyermek használja excl() függvényt, de az execl() függvényben megadott elérési út nincs definiálva. 
Nézzük meg, mi a kilépési állapot értéke annak a gyermeknek, amelyet a szülő kap.

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

Kimenet: 
 

Egy gyermekfolyamat kilépési állapota Linuxban
 

Megjegyzés: Előfordulhat, hogy a fenti kód nem működik online fordítóval, mivel a fork() le van tiltva.
Itt a kilépési állapot 127, ami azt jelzi, hogy probléma van az elérési úttal, vagy elírás van.
Az alábbiakban néhány kilépési állapotkód található további információként: 
 

  • 1 : Különféle hibák, mint például az „osztás nullával” és egyéb meg nem engedett műveletek.

  • 2 : Hiányzó kulcsszó vagy parancs vagy engedély probléma.
  • 126 : Az engedélyprobléma vagy a parancs nem végrehajtható
  • 128 : érvénytelen argumentum a kilépéshez.


Megjegyzés: A C szabvány nem határozza meg a visszatérési kódok jelentését. A visszatérési kódok használatára vonatkozó szabályok a különböző platformokon eltérőek.
 

Kvíz létrehozása