-2

私はそれが愚かな質問になるかもしれないことを知っていますが、誰かが私が次のコードスニペットの振る舞いを理解するのを手伝ってくれるでしょうか

//label 0
int main(){
  fork();//label 1
  fork();//label 2
  fork();//label 3
  return 0;
}

私の知る限り、プロセスツリーは次のようになります

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

私は正しいですか?その場合、2番目のフォークがラベル1フォークに対応するプロセスを生成せず、3番目のフォークがそれ以上プロセスを生成しない理由について混乱しています。つまり、子プロセスは(少なくともコードでは)親の正確なコピーであるため、親のコード全体を実行する必要があります。誰かがこの混乱で私を助けてくれますか...

4

4 に答える 4

4

はい、子はその親のコピーです。親が実行していたコードの場所を含め、実行状態も継承します。親が子のPID(> 0)で最初のfork()から戻ると、最初の子は0で戻り、2番目と3番目のフォークに進みます。子はmain()の先頭に戻るのではなく、それを作成したフォークの後で続行します。

コメントに応じて編集し直します。すべての戻り値の意味については、fork(2)のマニュアルページを参照してください。

于 2012-12-05T19:10:50.410 に答える
3

最初のフォークの後、2つのプロセスがあります。両方とも2番目のフォークにヒットし、合計4つのプロセスを作成します。

4つすべてが3番目のフォークにヒットするため、8つのプロセスがあります。その後、それらはすべて終了します。

于 2012-12-05T19:06:17.610 に答える
1

合計8つのプロセスが並行して行われるのは簡単です。

p ----------------
|                 |          // first fork() 
1c-------         p -------   
|        |        |        |      // second fork()
2c---    1c---    3c---    p----  
|   |    |    |   |    |   |    |    // third fork()
4c  2c   1c   5c  6c  3c   7c   p  

8合計8プロセスであるリーフノードを数えることができます。

説明:親pfork()2プロセス1cの最初の子と親をp呼び出しました。2番目fork()は両方のプロセス用です。したがって、プロセス1c、、、、。など、3回目の呼び出し後に8つのプロセスを取得します。フォーク後、新しいプロセスは、フォークされたコードの直後に実行されます。したがって、フォークの下のすべてのコードは、親プロセスと子プロセスの両方を対象としています。2c3cpfork()

于 2012-12-05T19:17:58.883 に答える
0

プロセスツリーは次のようになります。プロセスには次の命名規則を使用しました。親プロセス名の前に、それを作成した対応するフォークラベルを付けます。

                [0]
          /      |      \
        [01]    [02]    [03]
       /  \       |
    [012] [013] [023]
     /
   [0123]

@Matが言ったように、8つのプロセスが作成されます。

于 2012-12-05T19:19:05.563 に答える