logo

Afslutstatus for en underordnet proces i Linux

Det er kendt, at gaffel() systemopkald bruges til at oprette en ny proces, som bliver underordnet af opkaldsprocessen. 
Ved udgang efterlader barnet en udrejsestatus, som skal returneres til forælderen. Så når barnet er færdigt bliver det en zombie .
Når barnet forlader eller stopper, bliver forælderen sendt en SIGCHLD signal. 
Forælderen kan bruge systemkaldet wait() eller waitpid() sammen med makroerne WIFEXITED og WEXITSTATUS til at lære om status for dets stoppede barn.
(*)wait() systemkald : Det suspenderer udførelsen af ​​opkaldsprocessen, indtil et af dets børn afslutter. 
Syntaks for wait() systemkald: 

pid_t wait(int *status);


(*) Waitpid()-systemkaldet: Det suspenderer udførelsen af ​​opkaldsprocessen, indtil et underordnet angivet ved pid-argumentet har ændret tilstand. 
Syntaks for waitpid() systemkald: 

pid_t waitpid(pid_t pid int *status int options)


Bemærk: Som standard venter waitpid() kun for afsluttede børn, men denne adfærd kan ændres via optioner-argumentet såsom WIFEXITED WEXITSTATUS osv.
Værdien af ​​pid kan være: 
 



  1. Mindre end -1 : Betyder at vente på enhver underordnet proces, hvis procesgruppe-id er lig med den absolutte værdi af pid.
  2. Lige til -1: Betyder at vente på enhver underordnet proces.
  3. Lige til 0 : Betyder at vente på enhver underordnet proces, hvis procesgruppe-id er lig med opkaldsprocessens.
  4. Større end 0 : Betyder at vente på barnet, hvis proces-id er lig med værdien af ​​pid.


WIFEXITED og WEXITSTATUS er to af mulighederne, som kan bruges til at kende barnets udrejsestatus. 
WIFEXITED(status) : returnerer sand, hvis barnet afsluttede normalt.
WEXITSTATUS(status) : returnerer udgangsstatus for barnet. Denne makro bør kun bruges, hvis WIFEXITED returnerede true.
Nedenfor er en C-implementering, hvor barnet bruger execl() funktion, men stien angivet til execl() er udefineret. 
Lad os se, hvad der er udgangsstatusværdien for det barn, som forælderen 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; } 

Produktion: 
 

Afslutstatus for en underordnet proces i Linux
 

Bemærk: Ovenstående kode virker muligvis ikke med online compiler, da fork() er deaktiveret.
Her er udgangsstatus 127, hvilket indikerer, at der er et eller andet problem med stien, eller der er en tastefejl.
Nogle afgangsstatuskoder er angivet nedenfor for ekstra information: 
 

  • 1 : Diverse fejl såsom 'divider med nul' og andre utilladelige operationer.

  • 2 : Manglende nøgleord eller kommando eller tilladelsesproblem.
  • 126: Tilladelsesproblem eller kommando er ikke en eksekverbar
  • 128: ugyldigt argument for at afslutte.


Bemærk: C-standarden definerer ikke betydningen af ​​returkoder. Reglerne for brug af returkoder varierer på forskellige platforme.
 

Opret quiz