2013-10-19 7 views
29

親プロセスがすべての子プロセスが終了してフォークの後に続行するのを待つ方法について、誰かが気をつけたいと思っています。私は実行したいクリーンアップコードを持っていますが、子プロセスはこれが起こる前に返されている必要があります。親プロセスがすべての子プロセスを待つようにする

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

あなたは子供が終了したときに、どの心配している場合のPIDは、あなたのタスクで特に役立つすべてのそれらのフォークから返さ見つけることができます。それ以外の場合は 'n '回wait()を実行します。 – WhozCraig

答えて

24

POSIXは関数:wait(NULL);を定義します。 waitpid(-1, NULL, 0);の省略形です。子プロセスが終了するまで、呼び出しプロセスの実行を中断します。 ここで、第1引数のwaitpidは、子プロセスが終了するまで待機します。

あなたの場合、親はあなたのelse支店から電話するようにしてください。このような使用は、waitpidの

+0

あなたのお返事ありがとうございます。子プロセス以外のセクションにwait(NULL)を追加したところ、プログラムがハングアップし、子プロセスも実行しませんでした?? – Donatello

+1

OH、これはwait()のエラーではありません。デバッグできるように完全なコードを記述する必要があります。あなたはコードが単純すぎる、単なるモデルです。 – longdeqidao

+7

'wait 'のマンページは、子どもの** **が終了するのを待つことを示しています。上記の@WhozCraigのように、 'n '回待つ必要があります。 –

19

():

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

これは、すべての子どもたちが1人の子供childPid。より多くのプロセスがあれば、これは機能しません。 – JH95

+1

もちろん、単一の親プロセスから複数のスレッドを作成する場合は、この例を適宜変更する必要があります。いくつかのフォークを使用して例を提示すると、私の答えが混乱するように見えるでしょう。 –

+1

どのようにすべての子供が終了するのを待つために、このコードを変更するでしょうか? – 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

です。ありがとう! –

+0

ちょうどこのスニペットは私のために働いた...ありがとう。 – PMateus