logo

Antrinio proceso išėjimo būsena sistemoje „Linux“.

Yra žinoma, kad šakutė () sistemos skambutis naudojamas naujam procesui sukurti, kuris tampa skambinančiojo proceso antriniu. 
Išėjęs vaikas palieka išėjimo būseną, kuri turėtų būti grąžinta tėvui. Taigi, kai vaikas baigia, jis tampa a zombis .
Kai vaikas išeina arba sustoja, tėvas siunčiamas a SIGCHLD signalas. 
Tėvas gali naudoti sistemos iškvietimą wait() arba waitpid() kartu su makrokomandomis WIFEXITED ir WEXITSTATUS, kad sužinotų apie sustabdyto antrinio asmens būseną.
(*)wait() sistemos iškvietimas: jis sustabdo skambinimo proceso vykdymą, kol vienas iš jo vaikų nutrūks. 
„Wait()“ sistemos iškvietimo sintaksė: 

pid_t wait(int *status);


(*)Waitpid() sistemos iškvietimas: jis sustabdo iškvietimo proceso vykdymą, kol pid argumentu nurodytas vaikas nepakeis būsenos. 
Waitpid() sistemos iškvietimo sintaksė: 

pid_t waitpid(pid_t pid int *status int options)


Pastaba: Pagal numatytuosius nustatymus waitpid() laukia tik nutrauktų vaikų, tačiau šį elgesį galima pakeisti naudojant parinkčių argumentą, pvz., WIFEXITED WEXITSTATUS ir kt.
Pid reikšmė gali būti: 
 



  1. Mažiau nei -1 : Reiškia laukti bet kurio antrinio proceso, kurio procesų grupės ID yra lygus absoliučiai pid reikšmei.
  2. Lygu -1 : Reiškia laukti bet kokio antrinio proceso.
  3. Lygus 0 : Reiškia laukti bet kurio antrinio proceso, kurio procesų grupės ID yra lygus iškviečiamojo proceso ID.
  4. Didesnis nei 0 : Reiškia laukti vaiko, kurio proceso ID yra lygus pid reikšmei.


WIFEXITED ir WEXITSTATUS yra dvi parinktys, kurias galima naudoti norint sužinoti vaiko išėjimo būseną. 
WIFEXITED (būsena) : grąžina true, jei vaikas nutraukiamas įprastai.
WEXITSTATUS(būsena): grąžina vaiko išėjimo būseną. Šią makrokomandą reikia naudoti tik tuo atveju, jei WIFEXITED buvo pateiktas true.
Toliau pateikiamas C įgyvendinimas, kurį naudoja vaikas excl() funkcija, bet execl() nurodytas kelias yra neapibrėžtas. 
Pažiūrėkime, kokia yra vaiko išėjimo būsenos reikšmė, kurią gauna tėvai.

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

Išvestis: 
 

Antrinio proceso išėjimo būsena sistemoje „Linux“.
 

Pastaba: Aukščiau pateiktas kodas gali neveikti naudojant internetinį kompiliatorių, nes fork () yra išjungtas.
Čia išėjimo būsena yra 127, o tai rodo, kad yra kokių nors problemų dėl kelio arba yra rašybos klaida.
Norėdami gauti papildomos informacijos, toliau pateikiami keli išėjimo būsenos kodai: 
 

  • 1 : įvairios klaidos, pvz., „padalyti iš nulio“ ir kitos neleistinos operacijos.

  • 2: trūksta raktinio žodžio, komandos arba leidimo problema.
  • 126 : leidimo problema arba komanda nėra vykdomasis failas
  • 128 : netinkamas išėjimo argumentas.


Pastaba: C standartas neapibrėžia grąžinimo kodų reikšmės. Grąžinimo kodų naudojimo taisyklės įvairiose platformose skiriasi.
 

Sukurti viktoriną