【问题标题】:Parent Process not Waiting for Children - C父进程不等待子进程 - C
【发布时间】:2014-01-24 04:20:02
【问题描述】:

我正在编写一个旨在固定 CPU 使用率的程序,我将其用作衡量性能的工具。该程序相当简单,因为它从父进程生成 5 个子进程。以下是我的代码片段

int main(int argc, char **argv) {
  pid_t pid = 0; 
  int i;

  for(i = 0; i < 5; i++)
    //create 5 additional processes
    if((pid = fork()) == 0) {
        //do CPU intensive task
      break;
    }

  //fork error 
  if(pid == -1) {
    perror("<fork failed>\n");
    return EXIT_FAILURE;
  }

  //if parent
  if(pid != 0)
    //wait for children to finish
    wait(NULL);

  return EXIT_SUCCESS;
}

然而,尽管有 wait(NULL) 函数,父进程还是会立即退出。任何关于为什么会发生这种情况以及如何解决它的想法将不胜感激。

【问题讨论】:

  • 你确定孩子们还在跑步吗?你没有明确说明。
  • 等待失败了吗?也许将 errno 设置为 EFAULT?
  • 我确定孩子们还在跑步,我可以看到他们使用'top'

标签: c linux multiprocessing wait


【解决方案1】:

您正在创建五个孩子,但只要其中任何一个退出,wait 就会返回。您想等待所有这些,因此您需要反复拨打wait。当您没有孩子时,wait 函数返回 -1 并将 errno 设置为 ECHILD

while (wait(NULL) != -1 || errno != ECHILD) {
    // nothing
}

【讨论】:

    【解决方案2】:

    使用 waitpid() 函数调用。在您的情况下,您会产生 5 个子进程。并用最新的孩子覆盖 pid。

    wait() 等待任何子进程完成,而不是全部完成。

    当任何一个子进程完成其执行时,父进程退出,并向调用进程发送一个信号SIGCHLD,这足以让它终止。

    所以如果你想让所有 5 个子进程都执行,那么父进程分别完成指定 pid

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2013-12-17
      • 1970-01-01
      相关资源
      最近更新 更多