【问题标题】:Multiple child process多个子进程
【发布时间】:2010-10-26 23:18:13
【问题描述】:

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

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

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

【问题讨论】:

  • 线程不是更好吗?
  • 嗯,这可能是对的.. 但我需要练习多个 forking(),这意味着多个子进程..

标签: c fork child-process


【解决方案1】:

下面是如何分叉 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.
}

【讨论】:

  • 我没有真正得到第二部分(等待孩子退出)..状态是什么意思?那是一个子进程属性吗?
  • Status 是子进程的退出状态。它取决于 exit(...) 值,或者如果进程被信号杀死,那么它取决于信号编号。查看更多信息:linux.die.net/man/2/wait
  • 一个问题,你是从同一个根父母还是从每个孩子分叉?
  • 大家好!我想知道为什么子进程不分叉自己的新进程。我刚刚注意到对 exit(0) 的调用。我想问你:如果那里不存在该调用,那么子进程会调用 fork() 以及父进程,不是吗?我的意思是,第一个子进程将有 i = 0 并调用 10 个分叉...我的意思是,子进程将进入 for 循环,不是吗??
  • @flyer88:是的,他们会的。
【解决方案2】:

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

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

毕竟:如果你使用 pthreads,你将学到所有你需要知道的关于 fork() 的知识。

【讨论】:

  • 另一方面,如果你的工作是用户提供的,你会希望在一个新的进程中进行崩溃保护。
【解决方案3】:

如果你想启动多个分叉,你应该递归地进行。这是因为您必须从父进程调用 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);
        }
    }
}

【讨论】:

    【解决方案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
    }
    

    【讨论】:

    • 难道我们不应该也考虑一下 xxxChild 0) 会更合适...
    猜你喜欢
    • 2017-06-29
    • 2011-09-27
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2020-11-26
    • 2016-05-04
    相关资源
    最近更新 更多