2016-10-19 7 views
0

I午前次のコード所与:並行プロセス()

main() 
{ 
int i, rc; 
for (i = 0; i<=1; i++) 
{ 
    if((rc=fork()) == 0) 
    { 
    printf("Child %d executing\n",i); 
    } /*end if*/ 
} /*end for*/ 
} 
printf("All children created\n"); 

Iはまた、出力が起こり得るの可能な順列の溶液を与えられています。

子0実行中|

子1実行中|子供1 すべての子供を作成|

子1実行中|子供2 すべての子供が作成されました|

子1実行中|グランド子供 すべての子供を作成|

すべての子供|親

私はこれらの出力は、各プロセスによって作成されていることを知っているが、私はちょうど彼らがHOWこれらの出力が発生理解するためにトレーストラブルを抱えています。私が知っているfork()はプロセスを作成し、if (fork() == 0)はそれが子プロセスであることを意味しますが、それ以外のところで誰かが私の理解を助けることができたら子0実行|ありがとうございます。私は|どのプロセスが現在実行されているかの説明です。どのようにchild 1は "壮大な子供"を作成することができますが、子供0はできませんか?

+0

"出力が発生する可能性のある並べ替え"を置き換えるために質問を編集してください。それに続く引用ブロックが何であるかを明確に説明してください。 (これは、プロセスの出力とラベル付けの何らかの文字化けであり、ラベル付け中のプロセスの名前は説明されていません)(また、「Child 1 execution」は2回出力されます)。 – philipxy

答えて

1

最初に、ループが展開されていると、コードと動作がわかりやすくなります。

int rc; 

if ((rc = fork()) == 0) 
    printf("Child 0 executing\n");           

if ((rc = fork()) == 0) 
    printf("Child 1 executing\n"); 

printf("All children created\n"); 

次に、プロセスの階層をツリーとして描画することをお勧めします。ここでのASCIIバージョンである:グラフで

   main 
       /| 
      /| 
      /|\ 
      child0 | \ 
      | | \ 
      | | child1 
      /| | | 
     /| | | 
     /| | end 
     /end | 
    /  | 
    child1  end 
     |    
     |    
    end  

、child0」は、child1のは「子供1実行」ステートメントで、「終了」が表示printf文である「子0の実行」を表示printf文でありますすべての子どもたちが作った "。

グラフからわかるように、1x child0、2x child1、4x "すべての子が作成されました"と表示されます。

   P0 
       /| 
      /| 
      /|\ 
      P1 | \ 
      | | \ 
      | | P2 
      /| | | 
     /| | | 
     /| | end 
     /end | 
    /  | 
     P3  end 
     |    
     |    
    end  
  • UPDATEここ

    @bkennedy P0は、メイン(元の)プロセス及び "終了" の各工程を示す完了された状態で、唯一の工程図を示す別の図です。実際にはP0(メイン)、P1、P2、P3の4つのプロセスがあります。
  • P1はP0の最初の子です。 「子0実行中」と表示されます。
  • P2はP0の2番目の子です。 「子1実行中」と表示されます。 P2は決して子を生成せず、printfステートメントで終了します。
  • P3はP1の最初の(そして唯一の)子です。
  • 終了すると、すべてのプロセスに「すべての子が作成済み」と表示されます。

は覚えておいてください:

  • P0(メイン)ので、2つのフォーク呼び出し、2人の子供を通過します。
  • P1は1つのフォークコール、したがって1つの子(P3)を通過します。
  • P2は決してフォークコールを経由しません。

これは他のプロセス作成ではありません。私はあなたにこれをより良く説明する方法がわかりません。

+0

'child0'は別の子を生成することができますが、' child1'はできません。 – bkennedy

+0

グラフでは、さまざまなプロセスの出力を示しました。したがって、描かれた子ども1は同じプロセスではない。実際、main、child0、child1(1)、child1(2)の合計4つのプロセスがあります。 – flg

+0

child0が別の子を生成する理由を説明できますか? – bkennedy

0

最初のforkとifステートメントの後に、 "child 0 executing"プロセスとそのサイレント親プロセスmainが次のifステートメントに進みます。そこでは、両方とも「子1実行」プロセスを生成し、サイレント状態を維持します。メイン、「子0実行中」プロセス、メイン「子プロセス実行中」プロセス1、および「子プロセス実行中プロセス0子プロセス」の4つのプロセスはすべて、第2フォークおよびifステートメントの後に続きますそれは、「作成されたすべての子供たちを」印刷することであります。出力、出力され、「作成されたすべての子どもたちが、」出力されるの4「を実行児童1」の2で「実行児童0」の

一つのこと。

いいえ「子1は」子を作成しませんどのように子供1が「孫」を作成することができてくるが、子0ができない?

。メインと「子0」各レコード生成eは「子1」である。出力は明らかに "子0"の "子1"をmainの "大子"と呼んでいます。したがって、「子1」は子を作成せず、主子「0」は「子1」を生成する。ですから、あなたの質問は「子1」(そのうちの2つ)と「子0」の両方について間違っています。

これらの出力を引用し、「出力」は、メイン親、「子0」プロセス・チャイルド0、の主な「子1」プロセス子ども2と呼んでいるようだ

発生方法「子供を0」プロセスの「子1」プロセスグランド・チャイルド。ですから、 "出力"がプロセスに名前を付けることと、それらのプロセスが出力しているものとを区別する必要があります。また、 "Child 1 execution"という3行が出力されていますが、間違っています。しかし、は、私たちにと言わなければなりません。

関連する問題