子进程退出后如何执行父进程?

时间:2017-10-15 16:13:17

标签: c multiprocessing

#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){    
      fprintf(stderr, "Usage: %s processes\n", argv[0]);
      return 1; 
   }     
   n = atoi(argv[1]);  
   for (i = 1; i < n; i++)
      if (childpid = fork()) 
         break;

   if (childpid>0){ // parent process
      while (i>1) {
        wait(NULL);
        i--;
      }
   }

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

在此代码中退出所有子进程后,如何打印进程信息(父进程)。

输出:

i:1  process ID:2313  parent ID:2307  child ID:2314
i:3  process ID:2315  parent ID:2314  child ID:0
i:1  process ID:2314  parent ID:1  child ID:2315

我需要先让子进程退出,然后父进程需要打印其进程信息。

2 个答案:

答案 0 :(得分:4)

使等待跟踪循环更具信息性和更彻底。特别是,在循环的第一个循环中,父进程具有n == 1,因此它永远不会等待。反复等待直到没有更多的孩子等待可能会更好。

#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)
    {
        fprintf(stderr, "Usage: %s processes\n", argv[0]);
        return 1;
    }
    n = atoi(argv[1]);
    printf("Creating %d sub-processes\n", n);
    fflush(stdout);
    for (i = 1; i < n; i++)
    {
        if ((childpid = fork()) != 0)
            break;
    }

    printf("%d: i = %d, childpid = %d\n", (int)getpid(), i, childpid);

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

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

示例输出(程序编译为fork73):

$ fork73 4
Creating 4 sub-processes
62621: i = 1, childpid = 62622
62622: i = 2, childpid = 62623
62623: i = 3, childpid = 62624
62624: i = 4, childpid = 0
i: 4  process ID: 62624  parent ID: 62623  child ID:     0
62623: child 62624 exited with status 0x0000
i: 3  process ID: 62623  parent ID: 62622  child ID: 62624
62622: child 62623 exited with status 0x0000
i: 2  process ID: 62622  parent ID: 62621  child ID: 62623
62621: child 62622 exited with status 0x0000
i: 1  process ID: 62621  parent ID:   877  child ID: 62622
$

答案 1 :(得分:3)

您的计划的问题是这个声明 -

if (childpid = fork()) 

因此,父进程在第一次迭代中退出循环,因为fork()将子进程PID返回给它,子进程继续执行循环,因为fork()返回0。这就是为什么在你的输出中你得到一个子进程(PID-2314)作为进程的父进程(PID-2315) -

i:1  process ID:2313  parent ID:2307  child ID:2314
i:3  process ID:2315  parent ID:2314  child ID:0

正确的陈述是 -

if ((childpid = fork()) == 0)