logo

Exit-Status eines untergeordneten Prozesses in Linux

Das ist bekannt Gabel() Mit einem Systemaufruf wird ein neuer Prozess erstellt, der dem aufrufenden Prozess untergeordnet wird. 
Beim Verlassen hinterlässt das untergeordnete Element einen Beendigungsstatus, der an das übergeordnete Element zurückgegeben werden sollte. Wenn das Kind also fertig ist, wird es zu einem Zombie .
Immer wenn das untergeordnete Element aussteigt oder stoppt, wird dem übergeordneten Element ein gesendet SIGCHLD Signal. 
Das übergeordnete Element kann den Systemaufruf wait() oder waitpid() zusammen mit den Makros WIFEXITED und WEXITSTATUS verwenden, um den Status seines gestoppten untergeordneten Elements zu erfahren.
(*)wait() Systemaufruf: Er unterbricht die Ausführung des aufrufenden Prozesses, bis einer seiner untergeordneten Prozesse beendet wird. 
Syntax des Systemaufrufs wait(): 

pid_t wait(int *status);


(*)Der Systemaufruf waitpid(): Er unterbricht die Ausführung des aufrufenden Prozesses, bis ein durch das Argument pid angegebenes untergeordnetes Element seinen Status geändert hat. 
Syntax des Systemaufrufs waitpid(): 

pid_t waitpid(pid_t pid int *status int options)


Hinweis: Standardmäßig wartet waitpid() nur auf beendete untergeordnete Elemente, aber dieses Verhalten kann über das Optionsargument wie WIFEXITED WEXITSTATUS usw. geändert werden.
Der Wert von pid kann sein: 
 



  1. Kleiner als -1: Bedeutet, dass auf jeden untergeordneten Prozess gewartet wird, dessen Prozessgruppen-ID dem absoluten Wert von pid entspricht.
  2. Gleich -1: Bedeutet, auf einen untergeordneten Prozess warten.
  3. Gleich 0: Bedeutet, dass auf jeden untergeordneten Prozess gewartet wird, dessen Prozessgruppen-ID mit der des aufrufenden Prozesses übereinstimmt.
  4. Größer als 0: Bedeutet, dass auf das untergeordnete Element gewartet wird, dessen Prozess-ID dem Wert von pid entspricht.


WIFEXITED und WEXITSTATUS sind zwei der Optionen, mit denen der Ausstiegsstatus des Kindes ermittelt werden kann. 
WIFEXITED(status) : gibt true zurück, wenn das untergeordnete Element normal beendet wurde.
WEXITSTATUS(status) : gibt den Exit-Status des untergeordneten Elements zurück. Dieses Makro sollte nur verwendet werden, wenn WIFEXITED true zurückgegeben hat.
Unten finden Sie eine C-Implementierung, in der das Kind verwendet wird execl() Funktion, aber der für execl() angegebene Pfad ist undefiniert. 
Lassen Sie uns sehen, wie hoch der Exit-Statuswert des untergeordneten Elements ist, das das übergeordnete Element erhält.

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

Ausgabe: 
 

Exit-Status eines untergeordneten Prozesses in Linux
 

Notiz : Der obige Code funktioniert möglicherweise nicht mit dem Online-Compiler, da fork() deaktiviert ist.
Hier ist der Exit-Status 127, was darauf hinweist, dass ein Problem mit dem Pfad oder ein Tippfehler vorliegt.
Für zusätzliche Informationen sind unten einige Exit-Statuscodes aufgeführt: 
 

  • 1: Verschiedene Fehler wie „Dividieren durch Null“ und andere unzulässige Operationen.

  • 2: Problem mit fehlendem Schlüsselwort, Befehl oder Berechtigung.
  • 126: Berechtigungsproblem oder Befehl ist keine ausführbare Datei
  • 128: Ungültiges Argument zum Beenden.


Hinweis: Der C-Standard definiert nicht die Bedeutung von Rückgabecodes. Die Regeln für die Verwendung von Rückkehrcodes variieren je nach Plattform.
 

Quiz erstellen