3

私が遭遇するほとんどの例は、次のように fork する方法を示しています。

main()
{
    int    pid;

    pid = fork();
    // child
    if (pid == 0)                
    {
        ...
    }
    // Parent
    else if (pID > 0)            
    {
        ...
    }

}

2 人の子供をフォークする方法を示すものもあります。

pid = fork();
// Child
if ( pid==0 )
{
   ...
}

// Parent
else if ( pid>0 )
{
   pid=fork();

   // Second child
   if ( pid==0 ){
      ...
   }

}

そして、ここに5人の子供をフォークしようとする私の試みがあります...

pid = fork();
// Child
if ( pid==0 )
{
   ...
}

// Parent
else if ( pid>0 )
{
   pid=fork();

   // Second child
   if ( pid==0 ){
      ...
   }

   // Parent
   else if ( pid>0 )
   {
      pid=fork();

      // Third child
      if ( pid==0 ){
         ...
      }
      // Parent
      else if ( pid>0 )
      {
         pid=fork();

         // Fourth child
         if ( pid==0 ){
            ...
         }
         // Parent
         else if ( pid>0 )
         {
            pid=fork();

            // Fifth child
            if ( pid==0 ){
               ...
            }
         }
      }
   }
}

質問:

私の言いたいことは、これは狂気だということです。ループしてさまざまな数の子を作成する (つまり、コマンド ライン引数で指定する) よりクリーンな方法はありますか?

注: 私の仕事は、各プロセスが異なるコンピューターに信号を送ることを伴うため、子供たちが自分自身を区別することが非常に重要です (つまり、「こんにちは、私は 6 番の子供です...」と書きます)。現在、セマフォとターゲット コンピューターの配列を使用してそうしています。私が望むのは、プロセスのインデックス 1..N を増やすことです。

4

1 に答える 1

8

for ループを使用します。各プロセスは、ループ変数の独自のコピーを取得します。

int pid;
int numKids = 5;
int procNum;

for(procNum = 0; procNum < numKids; procNum++) {
    // Note: haven't included error handling...
    pid = fork();
    if (pid == 0) {
        break;
    }
}

if (pid == 0) {
    // child specific stuff. procNum is set to the "child number"
}
else {
    // parent stuff
}
于 2013-11-07T04:07:37.540 に答える