3

次のようなCファイルがあります。

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
int main () 
{ 
    pid_t child_pid; 
    printf ("The PID is %d\n", (int) getpid ()); 
    child_pid = fork (); 
    if (child_pid != 0)
    { 
        printf ("this is the parent process, with PID %d\n", 
        (int)getpid()); 
        printf ("the child's PID is %d\n", (int) child_pid); 
    } 
    else 
        printf ("this is the child process, with PID %d\n", 
        (int)getpid()); 
    return 0; 
} 

次のような階層を生成するように変更する必要があります

parent (0)
  |
  +---> child (1)
  |
  +---> child (2)
          |
          +----> child (3)
          |
          +----> child (4)
                  |
                  +----> child (5)
                  |

基本的に、2番目の子がそれぞれ2つの新しい子を作成するツリー構造。私が理解している限り、私がfork()プロセスを実行するとき、各プロセスは同時に実行されます。fork()ステートメントにaを追加するifと、親だけが新しいフォークを作成するため、機能し、プロセス0〜2が正しく作成されるようです。しかし、私はプロセス2を1ではなくフォークにする方法がわかりません。何かアイデアはありますか?

4

4 に答える 4

2

さて、プロセス1は最初のフォークによって作成されます。プロセス2は、ifステートメント内のフォークによって作成されます。したがって、プロセス2フォークも許可するには、2番目のフォークが0を返さなかった場合に、ifステートメント内で再度フォークします。

イラスト:

if(fork) {
    // Inside process 0
    if(fork) {
        // still in process 0
    } else {
        // in process 2
        if(fork) {
          // still in process 2
        } else {
          // in prcess 3
        }
        // and so on
    }
} else {
    // Inside process 1
}
于 2009-08-06T13:13:49.333 に答える
2

子は、フォーク時の親の状態のコピーを取得します。

したがって、親にカウンターまたはその他のプロパティがある場合、子にはフォークされた時点の値が表示されます(ただし、親が後で値を変更した場合は表示されません)。

于 2009-08-06T13:15:06.273 に答える
2

なぜこのようにしたいのかわかりませんが、通常は親プロセスのみがフォークを実行します。これも設計が簡単な場合があります。forループ内でfork()を実行すると、作成されたプロセスを直接制御できます。

特に多くのプロセスを作成する場合は、fork()は比較的コストのかかる操作であることに注意してください。より軽量な代替のvforkとスレッドが利用可能ですが、それらがあなたのニーズにも合うかどうかは判断できません。

于 2009-08-06T13:16:57.067 に答える
1

古い質問ですが、それでも興味深い質問です。のマニュアルページfork()は、戻り値は次のように記載されています。

成功すると、子プロセスのPIDが親に返され、0が子に返されます。失敗すると、親に-1が返され、子プロセスは作成されず、errnoが適切に設定されます。

fork()したがって、これは子に0を返すことがわかっているので、これを制御メカニズムとして使用できます。

int main()
{
   // Here we're in the parent (0) process

   if(fork())  // This starts the chain, only the parent will do this
    if(!fork()) //the child will pass this, the parent will skip it
     for(count = 0; counter < number_of_processes; counter++) //now the 2nd child loops
     {
         if(fork())
             if(!fork());
         else
             break;
     }

それにいくつかの数字を入れましょう:

//parent (18402)
if(fork()) // spawns 18403, parent 18402 keeps going
  if(!fork()) // spawns 18404, parent 18402 drops to the end of main()
    for(count = 0; count < number_of_processes; conter++) // 18404 enters here
      if(fork())  // 18404 forks 18405 and then goes on
        if(!fork());  // 18404 spawns 18406 before leaving, 18406 restarts the loop
        else
          break; // 18404 breaks out there
      else
          break; //18405 leaves the loop here

したがって、1回の反復の後、次のようになります。

  18402
    |
    +---> 18403
    |
    +---> 18404
            |
            +----> 18405
            |
            +----> 18406
                     |

この後、2つの新しいプロセスをループし続け、2番目のプロセスは、必要な数のパスを作成するまで繰り返します。

于 2012-12-03T19:19:07.620 に答える