Fork(),等待所有子进程完成vs等待一个孩子完成

时间:2018-06-19 03:00:34

标签: c fork parent-child wait

我不明白我应该在哪里使用wait(NULL)或while(pid = wait(& status))> 0)。我很困惑,我得到奇怪的结果,请帮助!。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main (int argc, char *argv[]) {
   pid_t childpid = 0; 
   int i, n;

   if (argc != 2){   /* check for valid number of command-line arguments */ 
      fprintf(stderr, "Usage: %s processes\n", argv[0]);
      return 1; 
   }     
   n = atoi(argv[1]);  
   for (i = 1; i < n; i++)
      if ((childpid = fork()) <= 0)
         break;

   fprintf(stderr, "i:%d  process ID:%ld  parent ID:%ld  child ID:%ld\n",
           i, (long)getpid(), (long)getppid(), (long)childpid);
   return 0; 
}
  1. 如何修改此代码,以便原始进程在所有子项退出后打印出其信息?

  2. 您如何修改此代码,以便进程在其子进程退出后打印其信息?

1 个答案:

答案 0 :(得分:4)

同样的修改可以完成这两项工作。

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

int main (int argc, char *argv[])
{
    pid_t childpid = 0; 
    int i, n;

    if (argc != 2)
    {   /* check for valid number of command-line arguments */ 
        fprintf(stderr, "Usage: %s processes\n", argv[0]);
        return 1; 
    } 
    n = atoi(argv[1]);  
    for (i = 1; i < n; i++)
    {
        if ((childpid = fork()) <= 0)
            break;
    }

    int corpse;
    int status;

    while ((corpse = wait(&status)) > 0)
    {
        fprintf(stderr, "%d: child %d exited with status 0x%.4X\n",
               (int)getpid(), corpse, status);
    }

    fprintf(stderr, "i:%d  process ID:%ld  parent ID:%ld  child ID:%ld\n",
            i, (long)getpid(), (long)getppid(), (long)childpid);
    return 0; 
}

当子进程执行wait()时,它立即失败,因为没有孙子等待。因此,孩子在“孩子们”(他们全部为零)退出后打印输出。

当父进程执行wait()循环时,它会在信息可用时报告每个子进程,然后打印自己的信息。

一般来说,你有一个以上的孩子,所以第二个问题有点含糊不清。但是,如果您希望它等待一个孩子(并且您不关心哪个孩子),则从wait()周围移除循环。如果您关心哪个孩子,请使用waitpid()而不是wait()

通过在子进程中返回i或从i计算的数字,可以使输出更有趣。请注意,在分支循环从1而不是0运行之前,如果在命令行中指定4,则会获得3个子进程和原始父进程。