0

このコードのプロセス作成ツリーは何ですか (すべてのフォークが成功すると仮定)?

if(fork())
    fork();
n = 3;
for(i=1;i<n;++i)
{
    if(pid = fork())
        break;
} 

これは私が試したものです:

        [0]
         |
         /\
     [1]    [1]
      |      |
     [2]    [2]
      |      |
     [3]    [3]
      |
     [4]

しかし、それは選択肢の 1 つではありませんでした。どんな助けでも大歓迎です。

4

1 に答える 1

0

最初の行:

if (fork())

このフォークの後、親と子の2つのプロセスがあります。親では、fork()はゼロ以外を返します。子では、fork()はゼロを返します。これは、次の行が親でのみ実行されることを意味します。

    fork();

親は再びフォークします。これで3つのプロセスがあり、3つすべてが残りのコードを実行します。

for(i=1;i<n;++i)
{
    if(pid = fork())
        break;
}

まず、i=1です。3つのプロセスはそれぞれ子を作成し、ゼロ以外の結果を確認して、ループから抜け出します。したがって、元の3つのプロセスが実行されます。しかし、子供たちは続けます。

次回ループを通過するときは、i=2です。同じことが起こります。3つの子プロセスのそれぞれは、それ自体の子を分岐し、ゼロ以外の結果を確認して、中断します。3人の新しい子供たちは続けます。

以下同様にi=n-1まで。

アスキーアートの試みは割愛しますが、結果として得られるツリーは、おなじみの銀器の一部のように見えます...

于 2012-09-26T15:43:05.417 に答える