logo

Afsluitstatus van een onderliggend proces in Linux

Dat is bekend vork() systeemaanroep wordt gebruikt om een ​​nieuw proces te creëren dat een onderliggend proces wordt van het oproepproces. 
Bij het verlaten verlaat het kind een exitstatus die moet worden teruggegeven aan de ouder. Dus als het kind klaar is, wordt het een zombie .
Telkens wanneer het kind weggaat of stopt, krijgt de ouder een bericht SIGCHLD signaal. 
De ouder kan de systeemaanroep wait() of waitpid() samen met de macro's WIFEXITED en WEXITSTATUS gebruiken om meer te weten te komen over de status van het gestopte kind.
(*)wait() systeemaanroep: Het schort de uitvoering van het aanroepproces op totdat een van de onderliggende elementen wordt beëindigd. 
Syntaxis van wait() systeemaanroep: 

pid_t wait(int *status);


(*)De waitpid() systeemaanroep: Het schort de uitvoering van het aanroepproces op totdat een kind gespecificeerd door het pid-argument van status is veranderd. 
Syntaxis van waitpid() systeemaanroep: 

pid_t waitpid(pid_t pid int *status int options)


Opmerking: Waitpid() wacht standaard alleen op beëindigde kinderen, maar dit gedrag kan worden gewijzigd via het optie-argument zoals WIFEXITED WEXITSTATUS etc.
De waarde van pid kan zijn: 
 



  1. Minder dan -1: Dit betekent dat u moet wachten op elk onderliggend proces waarvan de procesgroep-ID gelijk is aan de absolute waarde van pid.
  2. Gelijk aan -1: Dit betekent dat u moet wachten op een kindproces.
  3. Gelijk aan 0: Dit betekent dat u moet wachten op elk onderliggend proces waarvan de procesgroep-ID gelijk is aan die van het aanroepende proces.
  4. Groter dan 0: Dit betekent dat u moet wachten op het kind waarvan de proces-ID gelijk is aan de waarde van pid.


WIFEXITED en WEXITSTATUS zijn twee van de opties die kunnen worden gebruikt om de exitstatus van het kind te kennen. 
WIFEXITED(status) : retourneert waar als het kind normaal is beëindigd.
WEXITSTATUS(status) : retourneert de afsluitstatus van het kind. Deze macro mag alleen worden gebruikt als WIFEXITED waar retourneert.
Hieronder vindt u een C-implementatie waarin Child gebruikt execl() function, maar het pad dat is opgegeven naar execl() is niet gedefinieerd. 
Laten we eens kijken wat de uitgangsstatuswaarde is van het kind dat de ouder krijgt.

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

Uitgang: 
 

Afsluitstatus van een onderliggend proces in Linux
 

Opmerking : Bovenstaande code werkt mogelijk niet met de online compiler omdat fork() is uitgeschakeld.
Hier is de afsluitstatus 127, wat aangeeft dat er een probleem is met het pad of dat er een typefout is gemaakt.
Hieronder vindt u enkele exitstatuscodes voor extra informatie: 
 

  • 1: Diverse fouten zoals 'delen door nul' en andere ontoelaatbare bewerkingen.

  • 2: Probleem met ontbrekend trefwoord of commando of toestemming.
  • 126: Toestemmingsprobleem of opdracht is niet uitvoerbaar
  • 128: ongeldig argument om af te sluiten.


Opmerking: de C-standaard definieert de betekenis van retourcodes niet. Regels voor het gebruik van retourcodes variëren op verschillende platforms.
 

Quiz maken