1. ホーム
  2. c

[解決済み] For Loopでfork()がどうなるかをビジュアルに表現する

2023-06-26 14:58:12

質問

私は fork() の挙動を説明します。今回は for-loop . 次のコードを観察してください。

#include <stdio.h>

void main()
{
   int i;

   for (i=0;i<3;i++)
   {
      fork();

      // This printf statement is for debugging purposes
      // getppid(): gets the parent process-id
      // getpid(): get child process-id

      printf("[%d] [%d] i=%d\n", getppid(), getpid(), i);
   }

   printf("[%d] [%d] hi\n", getppid(), getpid());
}

以下はその出力です。

[6909][6936] i=0
[6909][6936] i=1
[6936][6938] i=1
[6909][6936] i=2
[6909][6936] hi
[6936][6938] i=2
[6936][6938] hi
[6938][6940] i=2
[6938][6940] hi
[1][6937] i=0
[1][6939] i=2
[1][6939] hi
[1][6937] i=1
[6937][6941] i=1
[1][6937] i=2
[1][6937] hi
[6937][6941] i=2
[6937][6941] hi
[6937][6942] i=2
[6937][6942] hi
[1][6943] i=2
[1][6943] hi

私はとても視覚的な人間なので、物事を本当に理解するためには図式化するしかないのです。私のインストラクターは、8つの ハイ ステートメントが8つあると言いました。私はコードを書いて実行しましたが、確かに 8 つの hi ステートメントがありました。しかし、本当に理解できなかったのです。そこで、次のような図を描きました。

コメントを反映させるために図を更新しました :)

観察結果

  1. 親プロセス(main)はループを3回反復する必要がある。その後、printfが呼ばれる
  2. 親プロセスの for ループの各繰り返しで fork() が呼び出されます。
  3. 各fork()呼び出しの後、iはインクリメントされるので、すべての子はiがインクリメントされる前からfor-loopを開始する。
  4. 各 for ループの終了時に "hi" が出力されます。

以下は私の質問です。

  • 私の図は正しいですか。
  • なぜ のインスタンスがあります。 i=0 が出力されますか?
  • どのような値の i はfork()の後、各子供に引き継がれるのでしょうか?もし、同じ値の i が引き継がれるのであれば、いつfork"が止まるのでしょうか?
  • 常に 2^n - 1 はフォークされた子供の数を数える方法でしょうか?では、ここで n=3 というのは 2^3 - 1 = 8 - 1 = 7 の子という意味ですが、どちらが正しいのでしょうか?

どのように解決するには?

以下は、理解するために、まずは for のループから始めます。

  1. ループは親から始まる。 i == 0

  2. fork() の、子1を作成します。

  3. これで2つのプロセスができました。どちらも印刷 i=0 .

  4. 両方のプロセスでループが再スタートし、現在 i == 1 .

  5. 親と子1 fork() で、子2、子3を作成します。

  6. これで4つのプロセスができました。4つとも印刷する i=1 .

  7. 4つのプロセスすべてでループが再スタートし、現在 i == 2 .

  8. 親子1~3人全員 fork() で、4から7までの子供を作る。

  9. これで8つのプロセスができました。8つとも印刷 i=2 .

  10. 8つのプロセスすべてでループが再スタートし、現在 i == 3 .

  11. ループは8つのプロセスすべてで、次のように終了します。 i < 3 が真でなくなったため、ループは8つのプロセスすべてで終了します。

  12. 8 つのプロセスすべてが印刷 hi .

  13. 8つのプロセスすべてが終了します。

ということで、以下のようになります。 0 が2回印刷されます。 1 が4回印刷されています。 2 が8回、そして hi が8回印刷されました。