19

有人可以帮助我了解如何创建具有相同父级的多个子进程以完成特定工作的“某些”部分吗?

例如,应用于子进程的外部排序算法;每个子进程对一部分数据进行排序,最后父进程合并它们。

编辑:也许我应该提到带有循环的分叉多个子进程..

4

4 回答 4

56

以下是如何分叉 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.
}
于 2009-05-18T08:07:19.187 回答
5

我认为值得指出为什么线程在这里更合适:

当您尝试并行完成工作的“一部分”时,我假设您的程序需要了解计算结果。进程的 fork() 共享的信息不超过 fork() 之后的初始信息。一个进程中的每一次更改都不为另一个进程所知,您需要将信息作为消息传递(例如,通过管道,请参阅“man pipe”)。进程中的线程共享相同的地址空间,因此能够操作数据并使它们“立即”彼此可见。还增加了更轻量级的好处,我会选择 pthreads()。

毕竟:如果您仍然使用 pthread,您将了解有关 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 回答
4

如果要启动多个分叉,则应递归执行。这是因为您必须从父进程调用 fork。否则,如果您启动第二个分叉,您将复制父进程和第一个子进程。这是一个例子:

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);
        }
    }
}
于 2016-10-13T09:23:46.000 回答