2017-11-22 1 views
1

Ich stieß auf einen Code in C, wo wir den Rückgabewert von wait überprüfen und wenn es kein Fehler ist, gibt es noch eine Überprüfung von WIFEXITED und WIFEXITSTATUS. Warum ist das nicht überflüssig? So weit ich verstehe wait gibt -1 zurück, wenn ein Fehler aufgetreten ist, während WIFEXITED einen Wert ungleich Null zurückgibt, wenn wait Kind normal beendet wird. Also, wenn es keinen Fehler in dieser Zeile gab if (wait(&status) < 0) warum würde irgendetwas schief gehen during WIFEXITED überprüfen?Warum sollten wir nach dem Warten WIFEXITED überprüfen, um unter Linux Systemaufrufe untergeordnete Prozesse zu beenden?

Dies ist der Code:

#include <stdio.h> 
#include <signal.h> 
#include <sys/wait.h> 
#include <stdlib.h> 
#include <unistd.h> 

#define CHILDREN_NUM 5 

int main() { 

    int i, status, pid, p; 
    for(i = 0; ((pid = fork()) < 0) && i < CHILDREN_NUM;i++) 
     sleep(5); 


    if (pid == 0) 
    { 
     printf(" Child %d : successfully created!\n",i); 
     exit(0); /* Son normally exits here! */ 
    } 

    p = CHILDREN_NUM; 
    /* The father waits for agents to return succesfully */ 
    while (p >= 1) 
    { 
     if (wait(&status) < 0) { 
      perror("Error"); 
      exit(1); 
     } 

     if (! (WIFEXITED(status) && (WEXITSTATUS(status) == 0))) /* kill all running agents */ 
     { 
      fprintf(stderr,"Child failed. Killing all running children.\n"); 
      //some code to kill children here 
      exit(1); 
     } 
     p--; 
    } 

    return(0); 
} 

Antwort

2

wait>= 0 Rückkehr erfahren Sie, ein Kind-Prozess beendet hat (und das wait Aufruf verfehlte nicht), aber es ist nicht zu sagen, ob dieser Prozess erfolgreich oder nicht beendet (oder wenn es signalisiert wurde).

Aber hier, in Ihrem Code sucht, ist es ziemlich offensichtlich, dass das Programm darum schert, ob das Kind Prozess, tat so erfolgreich oder nicht beendet:

fprintf(stderr,"Child failed. Killing all running children.\n");

So, das Programm muss weitere Tests auf der status Struktur tun, die von wait besiedelt wurde:

  • WIFEXITED(status): Wurde der Prozess normal beendet? (im Gegensatz zu signalisierten).
  • WEXITSTATUS(status) == 0: Wurde der Prozess mit Exit-Code 0 beendet (aka "Erfolg"). Weitere Informationen finden Sie unter: Meaning of exit status 1 returned by linux command.
1

wait(&status) wartet auf die Beendigung eines untergeordneten Prozesses. Die Kündigung kann aufgrund eines freiwilligen Ausstiegs oder aufgrund des Empfangs eines unbehandelten Signals erfolgen, dessen Standarddisposition es ist, den Prozess zu beenden.

WIFEXITED(status) und WIFSIGNALED(status) ermöglicht es Ihnen, die beiden * Fälle zu unterscheiden, und Sie können später entweder WEXITSTATUS oder WTERMSIG entweder den Exit-Status (if(WIFEXITED(status)) oder Beendigungssignal (if(WIFSIGNALED(status)) abgerufen werden.


* mit waitpid und speziellem Flags (WUNTRACED, WCONTINUED), können Sie auch auf Kind warten Prozess und Wiederaufnahmen stoppt, die Sie mit WIFSTOPPED oder WIFCONTINUED (nur Linux) bzw. erkennen können. Weitere Informationen finden Sie unter waitpid(2).

Verwandte Themen