c - Fork() 父级和子级

标签 c process fork parent-child

我需要的是 3 个 child 和 1 个家长(主程序),因为 child 和家长将具有不同的功能。 我不知道为什么我不能正确地做到这一点,据我所读,当你执行 fork() 时,如果它返回 0,则执行子代的代码,否则执行父代的代码。 所以,这是我的程序:

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

int
main(int argc, char ** argv) {

   printf ("Init Parent. PID =%d\n", getpid());

   fork();
   fork();
   if (fork() == 0) {
   printf ("Init Child. PID =%d\n", getpid());
    sleep(1);

   } else {        
    printf ("I am the parent. PID = %d\n",getpid()); 
    sleep(1);

   }
    exit(0);
}

这是输出:

Init Parent. PID =9007
I am the parent. PID = 9007
I am the parent. PID = 9009
Init Child. PID =9010
Init Child. PID =9011
I am the parent. PID = 9008
I am the parent. PID = 9012
Init Child. PID =9013
Init Child. PID =9014

这就是我想要的:

Init Parent. PID =9007
I am the parent. PID = 9007
Init Child. PID =9010
Init Child. PID =9011
Init Child. PID =9013
Init Child. PID =9014

我不知道为什么它说我是家长 3 次以及如何正确地做到这一点,因为 1

if (fork() == 0) 

看起来很糟糕。

我非常感谢您的帮助,提前谢谢您。

最佳答案

您必须从第一次 fork 后开始检查父子关系。 每次调用fork()时,您都会生成一个子进程。您现在正在做的是:

  • 开始执行 1 个程序(+1 个进程,总共 1 个进程)
  • 第一个 fork():主程序生成子程序(+1 个进程,总共 2 个进程)
  • 第二个fork():子程序主程序生成子程序。 (+2 个进程,总共 4 个进程)
  • 第三个fork():前面提到的所有进程生成子进程(+4 个进程,总共 8 个进程)。

原始代码生成的进程树如下所示:

      pi
    /  |  \
   pi  pi  pi
  / |  |  
 pi pi pi
 |
 pi

可能的解决方案(适用于n个 child ):

int noProcs = 3;
int i;
for (i = 0; i < noProcs; ++i) {
  if (fork() == 0) {
    printf("in child\n");
    //Do stuff...
    exit(0);
   }
 }
 //DONT FORGET: Reap zombies using wait()/waitpid()/SIGCHLD etc...

请注意,每次调用 fork() 后,生成的子进程都会执行相同的后续代码。对于循环迭代中的每个步骤,以下是我使用 fork() 生成子级后发生的情况:

  • 子进程:执行子代码,并调用exit()。这可以防止我们循环并创建比预期更多的子级。
  • 父进程:绕过 if(fork() == 0) 语句主体并逐步执行循环,根据指定生成其他子进程。

关于c - Fork() 父级和子级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23115820/

相关文章:

c - 矩阵乘法中的段错误

多个子级之间的 C++ 管道

c - 如何将包含十六进制字符代码的字符串转换为字符值?

c++ - 从字符串中读取/解析多个 INT

macos - 确定流程的架构

linux - 终止应用程序,多个嵌套子流程

C#:以干净的方式将调试器附加到进程

c - 从同一管道分两步读取

c++ - fork 命令是否适用于多线程应用程序?

C 为结构中的成员分配枚举值?