C:如何在孩子结束时打印父进程?

时间:2017-09-27 23:25:26

标签: c multithreading process-management

如何修改此代码,以便父进程打印出其信息,毕竟,子进程已执行完毕。

    #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 个答案:

答案 0 :(得分:4)

要将父流程与子流程同步,您希望使用waitwaitpid

https://linux.die.net/man/3/wait

首先,您可以在一个循环中调用wait,该循环将迭代您想要等待的子项数量的次数。在你完成所有孩子的产卵之后,也许这些事情可能会让你开始:

#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;

   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;
}