-3

假设我有如下代码


    switch (fork()) {
      case -1:
          //error checking
          break; 
      case 0:
          //child code
          break;
      default:
          int i;
          for (i = 0; i < n; i++) {
              switch (fork()) {
                  case -1:
                      //error checking
                      break; 
                  case 0:
                      //exec
                      break;
                  default:
                      //parent that waits for all childs to be created
                      break; 
              }
         }
    }

如何让第二个父进程等待所有其他进程被完全创建......我被告知我必须创建一个循环,但我不知道如何准确地实现它。假设有 n 个子进程。

4

1 回答 1

2

我想你可能稍微误解了这个要求。“第二个父母”这个词对我来说没有多大意义。

作为要求最有意义的是:

  • 父进程启动 N 个子进程。
  • 每个孩子都做适当的事情。
  • 然后父进程必须等待所有 N 个子进程完成。
  • 然后它可以报告自己的完成情况(或者继续其他工作,或者......)。

概括地说,您将拥有:

int pid;
for (int i = 0; i < N; i++)
{
    switch (pid = fork())
    {
    case 0:
        be_childish(i);
        /*NOTREACHED*/
        break;
    case -1:
        // Print error report
        break;
    default:
        printf("Started PID %d\n", pid);
        break;
    }
}

int status;
while ((pid = wait(&status)) > 0)
{
    printf("PID %d exited (status 0x%.4X)\n", pid, status);
}

printf("All done!\n");

注意/*NOTREACHED*/评论。我假设子进程从be_childish()函数内部退出。代码可以通过包含exit(1);or 或者_exit(1);or来确保没有损坏_Exit(1);。子进程不继续循环是相当重要的。

于 2012-06-02T07:43:41.690 回答