6
int x=0;
int main()
{
  for(i=0;i<2;i++)
  {
    fork();
    x=x+5;
  }
  return 0;
}

ダイアグラム

私はfork()概念の初心者です。上記のツリー (x値を含む) は、上記の C コードの正しい解決策ですか? ノード内のx値は、それぞれのプロセスの値です。

また、子プロセスから親プロセスに値を返すことはできますか? 上記のコード例xで、子の値を親プロセスに返すことができるとしますか?

4

3 に答える 3

7

それはプロセス ツリーであり、バブル内の値はx? いいえ、それは正しくありません。

子が生成されると、親の正確なコピーが取得されます...そのため、いくつかの値を「印刷」して、物事の状態を確認できるようにします (すべての PID を作成しています)。

開始すると、それは単なる親です。

parent (11174) x = 0, i = 0

次に、 を押しfork()ます。これで、2 つのプロセスができました。

 +--parent (11174) x = 0, i = 0
 |
 +->child1 (11175) x = 0, i = 0

次に数学:

 parent (11174) x = 5, i = 0

 child1 (11175) x = 5, i = 0

ループバックすると、i がインクリメントされ、各プロセスがループを実行してヒットしfork()ます。

 +--parent (11174) x = 5, i = 1
 |
 +->child2 (11176) x = 5, i = 1

 +--child1 (11175) x = 5, i = 1
 |
 +->child  (11177) x = 5, i = 1

ここで、全員が再び計算を行います。

 parent (11174) x = 10, i = 1

 child2 (11176) x = 10, i = 1

 child1 (11175) x = 10, i = 1

 child  (11177) x = 10, i = 1

最後に、全員がループにヒットし、インクリメントがループから抜け出しますi。したがって、最終結果は次のとおりです。

 parent (10)----->child1(10)---->child(10)
           |
           +----->child2(10)
于 2012-11-28T19:13:36.730 に答える
6

以下のコードを呼び出すfork()と、両方のプロセス、つまりparentchild.

forkアドレス空間が親プロセスとは異なる新しいプロセス (子と呼ばれる) を作成します。したがって、それらの間では何も共有されません。

ループ内で fork を呼び出しています。実際には 2 回、合計 4 つの独立したプロセスがあります。

子プロセスで個別のコーディングを行いたい場合は、常に次のfork()ような戻り値を使用します。

if(!fork())
{
 // child process
}
else 
{
 // parent process
}

質問はこちら:

    And also can we return values to the parent process from the child process?
    Suppose lets say in the above example code can I return the x value of the 
    child to the parent process?

答えは、あるプロセスから別のプロセスに値を直接返すことはできないということです。2 つ以上のプロセス間の通信は、2 つの方法で行うことができるプロセス間通信 (IPC) と呼ばれる概念を使用して実現されます。

1. shared memory 
2. memssage passing (pipe, rpc)

また、この問題を解決する前に理解しなければならないことがたくさんあります。特に、を使用してそれを実行しようとしていてfork、値を返したい場合

あなたはこれを見るべきです

または、これはあなたをもっと助けるかもしれません

于 2012-11-28T19:02:12.323 に答える
2
fork();

子プロセスを作成し、親のすべての変数を子変数にコピーします。

親:

For-Loop で述べたように、メイン プログラムは 2 つの子を作成 しますchild1i0child2i1

子 1:

Child1fork() の後に実行を開始し、実行i++され、次の iteration( i = 1) - 条件 true ( 1 < 2) で、isの値でChild1別の子 is をフォークchild3しました。child3i1

子 2 と子 3:

Child2fork() の後に実行をChild3開始し、実行され、現在は になり、条件が false になり、それ以上の子は作成されません。i = 1i++i2

3Total で作成されたプロセス。

コード:

int x=0;
int main()
{
  for(i=0;i<2;i++)
  {
    fork();
    x=x+5;
  }
  printf("x = %d\n", x);
 return 0;
}

出力:

x = 10
x = 10
x = 10
x = 10
于 2012-11-28T19:21:39.347 に答える