19

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

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

編集:ループで複数の子プロセスをフォークすることについて言及する必要があるかもしれません..

4

4 に答える 4

56

10 個の子を fork し、それらが終了するのを待つ方法は次のとおりです。

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.
}
于 2009-05-18T08:07:19.187 に答える
5

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

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

結局のところ: とにかく pthreads を使用すれば、 fork() について知る必要があるすべてを学ぶことができます。

于 2009-05-18T08:07:41.463 に答える
4

これは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
}
于 2009-05-18T07:48:58.140 に答える