it-swarm.com.de

Wie kann ich Eltern warten lassen, bis alle untergeordneten Prozesse abgeschlossen sind?

Ich hoffe, jemand könnte etwas Licht ins Dunkel bringen, wie die Eltern darauf warten sollen, dass ALLE Child-Prozesse beendet werden, bevor sie nach dem Fork fortfahren. Ich habe Bereinigungscode, den ich ausführen möchte, aber die untergeordneten Prozesse müssen zurückgegeben werden, bevor dies geschehen kann.

for (int id=0; id<n; id++) {
  if (fork()==0) {
    // Child
    exit(0);      
  } else {
    // Parent
    ...
  }
  ...
}
39
Donatello
pid_t child_pid, wpid;
int status = 0;

//Father code (before child processes start)

for (int id=0; id<n; id++) {
    if ((child_pid = fork()) == 0) {
        //child code
        exit(0);
    }
}

while ((wpid = wait(&status)) > 0); // this way, the father waits for all the child processes 

//Father code (After all child processes end)

wait wartet darauf, dass ein untergeordneter Prozess beendet wird, und gibt den pid dieses untergeordneten Prozesses zurück . Bei einem Fehler (z. B. wenn keine untergeordneten Prozesse vorhanden sind), -1 ist zurück gekommen. Im Grunde wartet der Code immer darauf, dass untergeordnete Prozesse beendet werden, bis die waiting-Fehler ausgegeben werden und Sie wissen, dass sie alle beendet sind.

46
adrisons

POSIX definiert eine Funktion: wait(NULL);. Es ist die Abkürzung für waitpid(-1, NULL, 0);, die die Ausführung des aufrufenden Prozesses anhält, bis ein untergeordneter Prozess beendet wird. Hier gibt das erste Argument von waitpid an, dass gewartet werden soll, bis ein untergeordneter Prozess beendet ist.

Lassen Sie es in Ihrem Fall von der übergeordneten Instanz in Ihrem Zweig else aufrufen.

26
longdeqidao

Verwenden Sie waitpid () wie folgt:

pid_t childPid;  // the child process that the execution will soon run inside of. 
childPid = fork();

if(childPid == 0)  // fork succeeded 
{   
   // Do something   
   exit(0); 
}

else if(childPid < 0)  // fork failed 
{    
   // log the error
}

else  // Main (parent) process after fork succeeds 
{    
    int returnStatus;    
    waitpid(childPid, &returnStatus, 0);  // Parent process waits here for child to terminate.

    if (returnStatus == 0)  // Verify child process terminated without error.  
    {
       printf("The child process terminated normally.");    
    }

    if (returnStatus == 1)      
    {
       printf("The child process terminated with an error!.");    
    }
}
22
Jason Enochs