繁体   English   中英

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

[英]how to execute parent process after child process has exited?

#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

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

使等待跟踪循环更具信息性和更彻底。 特别是,在循环的第一个循环中,父进程的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
$

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

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM