0


0

Cでプロセスツリーを作成する

深さNのバランスのとれた三分木のように見えるプロセス階層を作成するにはどうすればよいでしょうか? …​ 各プロセスには3つの子があるため、深さNのツリーには(3 ^ N-1)/ 2個のプロセスがあることになります。 新しいプロセスを作成するには、fork()のみを使用します。

これは私がこれまでに持っているものですが、プロセスIDを扱っていないため、それが機能するとは思わず、またこれを再帰的に行うべきではないと本当に思います:

void createTernaryTree(int n) {
   if((n-1) == 0) return;
   else {
      int x;
      for(x=0; x<3; x++) {
         fork();
         createTernaryTree(n-1);
      }
   }
}

ありがとう、フリスト

2 Answer


2


このビットは私には正しく見えません:

for(x=0; x<3; x++) {
   fork();
   createTernaryTree(n-1);
}

問題は、親と子の両方がループを繰り返し、再帰を実行することです。

forkからの戻り値(子では0、親では0、エラーでは-1)に基づいて、ループするか再帰するかを決定する必要があります。


0


The code shown would do the job The code shown would ほとんど仕事をしている(しかし微妙な問題がある)。 他の困難は、それが仕事をすることを示すことです。

問題は、分岐後の子プロセスと親プロセスでコードが異なる動作をしないことです。 親プロセスはループを完了する必要があります。 各子は次のレベルでループを再開する必要があります。

  for (int x = 0; x < 3; x++) // C99
  {
     if (fork() == 0)
     {
         createTernaryTree(n-1);
         break;  // Per comment from R Samuel Klatchko
     }
  }
  pause();  // See below

「pause();」を追加できます(すべきです)。ループの後に呼び出します。これは、シグナルを受信するまで、親プロセスを一時停止したアニメーションに送ります。 その後、プロセスのツリーがあることを示すことができます。 または、「sleep(30)」またはプロセスを中断する他の方法を使用します。 すぐに終了させたくないでしょう。ツリー構造をデモンストレーションできるようにするには、それらの処理が速すぎます。

理論的には、「fork()」が成功するかどうかを追跡することができます。実際には、おそらく最初の子が失敗した場合に2番目の子を作成しようとしないことを除いて、あなたが異なることをするのは明らかではありません他の状況では、通常は非常に重要です)。

ツリーは本質的に再帰的な構造です。再帰を使用してそれらを管理することは、多くの場合、それらに対処する最も近い方法です。 これは末尾再帰のように見えるため、ループ構造にかなり簡単に変換できます。 ただし、何が起こっているのかを把握するためにデータ構造を管理することは、単に再帰的に行うよりも困難になります。