2013-10-19 21 views
29

Spero che qualcuno possa fare luce su come far attendere al genitore che TUTTI i processi figli finiscano prima di continuare dopo il fork. Ho il codice di pulizia che voglio eseguire, ma i processi figli devono essere restituiti prima che ciò possa accadere.Attesa del genitore per tutti i processi figlio

for (int id=0; id<n; id++) { 
    if (fork()==0) { 
    // Child 
    exit(0);  
    } else { 
    // Parent 
    ... 
    } 
    ... 
} 
+2

Troverete le pid restituito da tutte quelle forche particolarmente utile nel vostro compito, se vi preoccupate per quale bambino è uscito e quando. Altrimenti 'wait()' per 'n' volte. – WhozCraig

risposta

24

POSIX definisce una funzione: wait(NULL);. È la scorciatoia per waitpid(-1, NULL, 0);, che sospenderà l'esecuzione del processo chiamante fino all'uscita di un processo figlio. Qui, il primo argomento di waitpid indica l'attesa di terminare qualsiasi processo figlio.

Nel tuo caso, chiedi al genitore di chiamarlo dal tuo ramo else.

+0

Grazie per le risposte. Ho aggiunto in attesa (NULL) nella sezione non child, e il programma si blocca e i processi figli non vengono nemmeno eseguiti ?? – Donatello

+1

OH, Questo non è un errore di attesa(). Dovresti inserire il tuo codice completo per consentirmi di eseguirne il debug. Il codice è troppo semplice, solo un modello. – longdeqidao

+7

La pagina di manuale per 'wait' dice che aspetta ** uno ** dei bambini per terminare. Come @WhozCraig menzionato sopra devi 'aspettare' per' n' volte. –

19

Usa waitpid() in questo modo:

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!.");  
    } 
} 
+2

Che non aspetta che tutti i bambini finiscano solo il un bambino childPid. Se ci fossero più processi questo non funzionerebbe. – JH95

+1

Ovviamente se crei più thread da un singolo processo genitore, dovrai modificare questo esempio di conseguenza. Fornire un esempio con diverse forcelle avrebbe reso la mia risposta un po 'confusa. –

+1

come modificheresti questo codice affinché il genitore attenda che TUTTI i bambini finiscano? – OutFall

27
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) 
+1

Molto utile. Grazie! –

+0

Solo questo cecchino ha funzionato per me ... GRAZIE. – PMateus

Problemi correlati