logo

Avslutt status for en underordnet prosess i Linux

Det er kjent at gaffel() systemanrop brukes til å opprette en ny prosess som blir barnet til anropsprosessen. 
Ved utgang etterlater barnet en utgangsstatus som skal returneres til forelderen. Så når barnet er ferdig blir det en zombie .
Hver gang barnet går ut eller stopper, blir forelderen sendt en SIGCHLD signal. 
Forelderen kan bruke systemkallingen wait() eller waitpid() sammen med makroene WIFEXITED og WEXITSTATUS for å lære om statusen til det stoppede barnet.
(*)wait() systemanrop : Den suspenderer utførelsen av anropsprosessen til en av dens barn avsluttes. 
Syntaks for wait() systemkall: 

pid_t wait(int *status);


(*) Systemkallet waitpid() : Den suspenderer utførelsen av anropsprosessen til et barn spesifisert av pid-argumentet har endret tilstand. 
Syntaks for waitpid() systemanrop: 

pid_t waitpid(pid_t pid int *status int options)


Merk: Som standard venter waitpid() bare for avsluttede barn, men denne oppførselen kan endres via alternativ-argumentet som WIFEXITED WEXITSTATUS etc.
Verdien av pid kan være: 
 



  1. Mindre enn -1 : Dette betyr å vente på en underordnet prosess hvis prosessgruppe-ID er lik den absolutte verdien av pid.
  2. Lik -1: Betyr vente på en eventuell underordnet prosess.
  3. Lik 0 : Dette betyr å vente på en underordnet prosess hvis prosessgruppe-ID er lik den for anropsprosessen.
  4. Større enn 0 : Betyr vente på barnet hvis prosess-ID er lik verdien av pid.


WIFEXITED og WEXITSTATUS er to av alternativene som kan brukes til å vite utgangsstatusen til barnet. 
WIFEXITED(status) : returnerer sann hvis barnet avsluttet normalt.
WEXITSTATUS(status) : returnerer utgangsstatusen til barnet. Denne makroen skal bare brukes hvis WIFEXITED returnerte sann.
Nedenfor er en C-implementering der barnet bruker execl() funksjon, men banen spesifisert til execl() er udefinert. 
La oss se hva som er utgangsstatusverdien til barnet som forelderen får.

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

Produksjon: 
 

Avslutt status for en underordnet prosess i Linux
 

Merk: Koden ovenfor fungerer kanskje ikke med online kompilator da fork() er deaktivert.
Her er utgangsstatusen 127 som indikerer at det er et problem med banen eller det er en skrivefeil.
Noen få utgangsstatuskoder er oppført nedenfor for ekstra informasjon: 
 

  • 1: Forskjellige feil som «divide med null» og andre utillatte operasjoner.

  • 2 : Manglende nøkkelord eller kommando eller tillatelsesproblem.
  • 126: Tillatelsesproblem eller kommando er ikke en kjørbar
  • 128: ugyldig argument for å avslutte.


Merk: C-standarden definerer ikke betydningen av returkoder. Regler for bruk av returkoder varierer på ulike plattformer.
 

Lag quiz