2

我正在做一些并行编程(多处理),我需要父母:

  1. Fork几个孩子

  2. 在创建所有孩子之后,只需等待所有孩子终止

  3. 在所有孩子都终止后,做一些其他的工作。

这是我尝试过的:

 int main(int argc, char **argv[])
{

  int j, i;
  pid_t children[3];
  int pid;

  // Fork the processes
  for(j = 0; j < 3; j++){
    if((children[j] = fork()) == 0){
      // Child process
      for(i = 0; i < 2; i++){
        printf("child %d printing: %d\n", j, i);
      }
    }else {
        // In parent now
        while (pid = waitpid(-1, NULL, 0)) {
            if (errno == ECHILD) {
                break;
            }
        }
        
        printf("all children terminated. in parent now\n");
    }
  }

  return 0;
}

没有给出正确的输出。“所有孩子都终止了。现在在父母中”被打印了好几次,甚至在所有孩子都死之前。此外,对于每个进程,我应该只看到 2 个输出,但我看到的更多。

4

2 回答 2

2

这是您想要实现的更多目标吗?我刚刚为每个孩子设置了一个简单的计数,并延迟增加并行化的可见性。

#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, char **argv[])
{
  int i, j, k;
  int pid;

  // Fork the processes
  for(j = 0; j < 3; j++)
  {
    if (fork() == 0)
    {
        printf("starting child %d\n", j);
        // Child process - do your child stuff
        for (i = 0; i < 5; ++i)
        {
          for (k = 0; k < 10000000; ++k);
          printf("child %d printing: %d\n", j, i);
        }
         printf("child %d ending\n", j);
        // then just quit
        exit(0);
    }
  }

  j = 1;
  while (wait(NULL) > 0)
  {
    printf("%d child completed\n", j++);
  }

  // In parent now
  printf("all children terminated. in parent now\n");

  return 0;
}

我得到的输出是

starting child 0
starting child 1
child 0 printing: 0
starting child 2
child 1 printing: 0
child 0 printing: 1
child 2 printing: 0
child 1 printing: 1
child 0 printing: 2
child 0 printing: 3
child 2 printing: 1
child 1 printing: 2
child 1 printing: 3
child 0 printing: 4
child 0 ending
child 2 printing: 2
1 child completed
child 1 printing: 4
child 1 ending
2 child completed
child 2 printing: 3
child 2 printing: 4
child 2 ending
3 child completed
all children terminated. in parent now
于 2012-11-20T02:21:58.300 回答
1

每个孩子都在执行循环和分叉。j您需要在打印输出后跳出循环。由于这些孙子不是原始父代的子代,并且第一代子代从不等待它们,因此未指定输出顺序。此外,您需要waitpid退出 j 循环并且在所有子代都被分叉之前不要执行它。

于 2012-11-20T01:37:44.597 回答