2011-10-21 1 views
0

メインプロセスを実行して4つのサブプロセスを作成したいと考えています。それらが作成されたら、メインプロセスが完了するのを待つようにします。ループ内でのforkが考えられないようにする

これは私の全体のコードです:

.. 
[8508] I the child, will sleep 
[8503] I the parent, have waited for my children! 
[8511] I the child, will sleep 
[8510] I the child, will sleep 
[8509] I the child, will sleep 
[8520] I the child, will sleep 
[8511] I the parent, have waited for my children! 
[8510] I the parent, have waited for my children! 
(prompt stuck) 

なぜ親は最後に、一度に複数回プリントアウトの代わりん:私が代わりに何を得る

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/wait.h> 


int main(){ 

    int i; 
    int childID; 
    int status; 

    for (i=0;i<4;i++){ 
     childID=fork(); 
     if (childID==0){ 
      printf("[%d] I the child, will sleep\n", (int)getpid()); 
      sleep(1); 
     } 
    } 

    if (!childID){ 
     wait(&status); 
     printf("[%d] I the parent, have waited for my children!\n", (int)getpid()); 
    } 

    return 0; 
} 

はこれですか?

+1

出力があなたのコードと一致しません。それを訂正してください –

+0

あなたが私たちに与えたコードは、「私は親です、私の子供を待つでしょう!コードにはそれ以上のものがありますか? – murgatroid99

+1

回答に記載されているように、あなたの子供たちもフォークするだけでなく、あなたの子供たちのすべてではなく、最後のフォークされた子供を待っています。 – Shahbaz

答えて

3

複数回書いた親ではなく、最初の3人の子供です。 forkのとき、子供はそのアドレス空間、スタック、レジスタ、すべてを含むプロセスの正確なコピーを取得します。つまり、最初の子の後には、forkの親と新しい子の両方がforを3回繰り返して3つの新しい子を作成します。あなたはforのうちbreak所望の効果のための子供のように実行すべきである:印刷物のPIDで

if (childID==0){ 
     printf("[%d] I the child, will sleep\n", (int)getpid()); 
     sleep(1); 
     break; 
    } 
+0

私はfork()が実行された後でコードを実行すると思っていました。だから、フォークがループ内にあるので、私はループ全体をバイパスし、それを続けると考えていたかもしれません。 – Pithikos

+0

ループの次の反復は "fork()"の後のコードです。 –

1

ルック。 8510および8511は元の親ではなく、子である。ループをフォークすると、子供たちもそのループに入ります。 sleep(1)の後にbreak;を入れてみてください。

0

ループを実行すると、一度フォークすると、子プロセスはフォークオフされた後の最初の反復中にスリープしますが、それ以降はさらにプロセスをフォークします。 childIDはこれらのプロセスのためにもはや0ではないので、waitを呼び出さないので、子どもを育てることはありません。これは、すべての待機呼び出しが完了してもプロセスが実行されているため、端末がハングすることを意味します。

関連する問題