logo

Lapsiprosessin poistumistila Linuxissa

Se tiedetään haarukka() järjestelmäkutsua käytetään luomaan uusi prosessi, josta tulee soittajan prosessin lapsi. 
Poistuessaan lapsi jättää poistumistilan, joka tulee palauttaa vanhemmalle. Joten kun lapsi lopettaa, siitä tulee a zombie .
Aina kun lapsi poistuu tai pysähtyy, vanhemmalle lähetetään a SIGCHLD signaali. 
Vanhempi voi käyttää järjestelmäkutsua wait() tai waitpid() yhdessä makrojen WIFEXITED ja WEXITSTATUS kanssa saadakseen selville pysäytetyn alatason tilan.
(*)wait() järjestelmäkutsu: Se keskeyttää kutsuprosessin suorittamisen, kunnes yksi sen lapsista lopettaa. 
Waita()-järjestelmäkutsun syntaksi: 

pid_t wait(int *status);


(*)Waitapid()-järjestelmäkutsu: Se keskeyttää kutsuprosessin suorittamisen, kunnes pid-argumentin määrittämä lapsi on vaihtanut tilaa. 
Waitpid()-järjestelmäkutsun syntaksi: 

pid_t waitpid(pid_t pid int *status int options)


Huomautus: Oletuksena waitpid() odottaa vain lopetettuja lapsia, mutta tätä toimintaa voidaan muokata optionargumentilla, kuten WIFEXITED WEXITSTATUS jne.
Pid:n arvo voi olla: 
 



  1. Vähemmän kuin -1 : Tarkoittaa, että odota mitä tahansa aliprosessia, jonka prosessiryhmän tunnus on yhtä suuri kuin pid:n absoluuttinen arvo.
  2. Yhtä kuin -1: Tarkoittaa, että odota mitä tahansa aliprosessia.
  3. Equal to 0 : Tarkoittaa, että odota mitä tahansa aliprosessia, jonka prosessiryhmän tunnus on sama kuin kutsuvan prosessin.
  4. Suurempi kuin 0 : Tarkoitus odottaa lasta, jonka prosessitunnus on yhtä suuri kuin pid:n arvo.


WIFEXITED ja WEXITSTATUS ovat kaksi vaihtoehtoa, joiden avulla voidaan tietää lapsen poistumistila. 
WIFEXITED(tila) : palauttaa tosi, jos lapsi lopettaa normaalisti.
WEXITSTATUS(tila) : palauttaa lapsen poistumistilan. Tätä makroa tulisi käyttää vain, jos WIFEXITED palautti tosi.
Alla on C-toteutus, jossa lapsi käyttää excl() funktio, mutta execl():lle määritetty polku on määrittelemätön. 
Katsotaanpa, mikä on vanhemman saaman lapsen poistumistilan arvo.

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

Lähtö: 
 

Lapsiprosessin poistumistila Linuxissa
 

Huomautus: Yllä oleva koodi ei välttämättä toimi online-kääntäjän kanssa, koska fork() on poistettu käytöstä.
Tässä poistumistila on 127, mikä osoittaa, että polussa on jokin ongelma tai kirjoitusvirhe.
Muutama poistumistilakoodi on lueteltu alla lisätietojen saamiseksi: 
 

  • 1 : Sekalaiset virheet, kuten "jakaa nollalla" ja muut kielletyt toiminnot.

  • 2 : Puuttuva avainsana tai komento tai lupaongelma.
  • 126 : Lupaongelma tai komento ei ole suoritettava
  • 128 : virheellinen poistumisargumentti.


Huomautus: C-standardi ei määrittele palautuskoodien merkitystä. Palautuskoodien käyttöä koskevat säännöt vaihtelevat eri alustoilla.
 

Luo tietokilpailu