父母过程不等孩子 - C.

时间:2014-01-24 04:20:02

标签: c linux multiprocessing wait

我正在编写一个旨在固定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)函数,但父进程会立即退出。关于为什么会发生这种情况以及如何解决问题的任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

使用 waitpid()函数调用。在您的情况下,您的产卵5子过程。并用最新的孩子覆盖了pid。

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

当任何一个孩子完成执行并将 SIGCHLD 信号发送回调用进程时,

parent退出,这足以使其终止。

所以如果你想要所有5个子进程执行,那么父进行完成单独指定pid