logo

Avsluta status för en underordnad process i Linux

Det är känt att gaffel() systemanrop används för att skapa en ny process som blir barn till anropsprocessen. 
Vid utgång lämnar barnet en utgångsstatus som ska återlämnas till föräldern. Så när barnet är färdigt blir det en zombie .
Närhelst barnet går ut eller stannar skickas föräldern en SIGCHLD signal. 
Föräldern kan använda systemanropet wait() eller waitpid() tillsammans med makrona WIFEXITED och WEXITSTATUS för att lära sig om statusen för dess stoppade underordnade.
(*)wait() systemanrop : Den avbryter exekveringen av anropsprocessen tills ett av dess underordnade avslutar. 
Syntax för wait() systemanrop: 

pid_t wait(int *status);


(*) Systemanropet waitpid() : Det avbryter exekveringen av anropsprocessen tills ett barn som specificerats av pid-argumentet har ändrat tillstånd. 
Syntax för waitpid() systemanrop: 

pid_t waitpid(pid_t pid int *status int options)


Obs: Som standard väntar waitpid() endast för avslutade barn men detta beteende kan ändras via alternativargumentet som WIFEXITED WEXITSTATUS etc.
Värdet på pid kan vara: 
 



  1. Mindre än -1 : Betyder att vänta på en underordnad process vars processgrupps-ID är lika med det absoluta värdet av pid.
  2. Lika med -1: Betyder att vänta på någon underordnad process.
  3. Lika med 0 : Betyder att vänta på en underordnad process vars processgrupps-ID är lika med det för anropsprocessen.
  4. Större än 0 : Betyder vänta på barnet vars process-ID är lika med värdet på pid.


WIFEXITED och WEXITSTATUS är två av alternativen som kan användas för att veta barnets utgångsstatus. 
WIFEXITED(status) : returnerar sant om barnet avslutades normalt.
WEXITSTATUS(status) : returnerar utgångsstatus för barnet. Detta makro bör endast användas om WIFEXITED returnerade sant.
Nedan är en C-implementation där barn använder execl() funktion men sökvägen som anges till execl() är odefinierad. 
Låt oss se vad är utgångsstatusvärdet för barnet som föräldern 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: 
 

Avsluta status för en underordnad process i Linux
 

Obs: Ovanstående kod kanske inte fungerar med onlinekompilator eftersom fork() är inaktiverat.
Här är utgångsstatusen 127 vilket indikerar att det finns något problem med sökvägen eller att det är ett stavfel.
Några utgångsstatuskoder listas nedan för extra information: 
 

  • 1 : Diverse fel som "dividera med noll" och andra otillåtna operationer.

  • 2: Saknat nyckelord eller kommando eller behörighetsproblem.
  • 126 : Behörighetsproblem eller kommando är inte en körbar fil
  • 128: ogiltigt argument för att avsluta.


Obs: C-standarden definierar inte innebörden av returkoder. Regler för användning av returkoder varierar på olika plattformar.
 

Skapa frågesport