C:如何在子进程末尾打印父进程?

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

最佳答案

要使父进程与子进程同步,您需要使用 waitwaitpid

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

为了简单起见,您可以在一个循环中调用 wait,该循环的迭代次数与您希望等待的 child 的数量相同。也许在您完成所有 child 的产卵后,沿着这些思路可以让您开始:

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

关于C:如何在子进程末尾打印父进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46458684/

相关文章:

c# - 多线程读取xml文件

java - 是否可以从另一个虚拟机中杀死一个 Java 虚拟机?

c - 在 C 语言中,为什么只在初始化已创建线程列表后才调用 pthread_join?

c - 质数算法

java - 在消息处理程序的根中启动一个新线程是否有意义

java - 将 "daemon"-status 传播到 Java 中的所有子线程

c - 编辑我的代码以了解输入是否是二叉树

c - 预期表达式错误为 `[]`

python - 管理服务器上脚本的运行

project-management - 项目管理和过程管理的区别