web-dev-qa-db-ja.com

複数の子プロセス

特定の仕事の「一部の」部分を実行するために、同じ親を持つ複数の子プロセスを作成する方法について誰かが私を助けることができますか?

たとえば、子プロセスに適用される外部ソートアルゴリズム。各子プロセスはデータの一部を並べ替え、最後に親プロセスがそれらをマージします。

編集:たぶん私はループを持つ複数の子プロセスのフォークについて言及する必要があります。

13
israkir

ここでは、10人の子供をフォークして、完了するまで待つ方法を示します。

pid_t pids[10];
int i;
int n = 10;

/* Start children. */
for (i = 0; i < n; ++i) {
  if ((pids[i] = fork()) < 0) {
    perror("fork");
    abort();
  } else if (pids[i] == 0) {
    DoWorkInChild();
    exit(0);
  }
}

/* Wait for children to exit. */
int status;
pid_t pid;
while (n > 0) {
  pid = wait(&status);
  printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status);
  --n;  // TODO(pts): Remove pid from the pids array.
}
45
pts

ここでスレッドがより適切である理由を指摘する価値があると思います。

ジョブの「一部」を並行して実行しようとしているので、プログラムが計算の結果を知る必要があると仮定します。プロセスのfork()は、fork()の後の初期情報以上を共有しません。 1つのプロセスでのすべての変更は他のプロセスには認識されず、情報をメッセージとして渡す必要があります(たとえば、パイプを介して、「man pipe」を参照)。プロセス内のスレッドは同じアドレス空間を共有するため、データを操作して、他の「すぐに」それらを可視にすることができます。また、軽量化の利点を追加して、pthreads()を使用します。

結局のところ、とにかくpthreadを使用している場合は、fork()について知っておく必要があるすべてのことを学びます。

5
pmr

複数のフォークを起動する場合は、再帰的に実行する必要があります。これは、親プロセスからforkを呼び出す必要があるためです。それ以外の場合、2番目のフォークを起動すると、親プロセスと最初の子プロセスの両方が複製されます。次に例を示します。

void forker(int nprocesses)
{
    pid_t pid;

    if(nprocesses > 0)
    {
        if ((pid = fork()) < 0)
        {
            perror("fork");
        }
        else if (pid == 0)
        {
            //Child stuff here
            printf("Child %d end\n", nprocesses);
        }
        else if(pid > 0)
        {
            //parent
            forker(nprocesses - 1);
        }
    }
}
5
mjdev

fork でこれを行うことができます。与えられた親は好きなだけフォークすることができます。しかし、私はAviDに同意します pthreads の方が適切かもしれません。

pid_t firstChild, secondChild;
firstChild = fork();
if(firstChild > 0)
{
  // In parent
  secondChild = fork();
  if(secondChild > 0)
  {
    // In parent
  }
  else if(secondChild < 0)
  {
    // Error
  }
  else
  {
    // In secondChild
  }
}
else if(firstChild < 0 )
{
  // Error
} 
else
{
  // In firstChild
}
3