多个分叉不起作用

Multiple forks does not work

本文关键字:不起作用 分叉      更新时间:2023-10-16

>我正在尝试创建 5 个孩子和 1 个父母。但是父级将创建它们(至少 4 个。因为首先我们需要分叉),但它创造了一群孩子。找不到我做错了什么。请问有什么想法吗?

child0=fork();//first process
if(child0>0)//Parent
{
    //Create children
    child1=fork();
    child2=fork();
    child3=fork();
    child4=fork();
    cout<<"i am child 0 "<<child0 <<"  ";
    cout<<"i am child 1 "<<child1;
    cout<<"i am child 2 "<<child2;
    cout<<"i am child 3 "<<child3;
    cout<<"i am child 4 "<<child4;
    wait(child0);
    wait(child1);
    wait(child2);
    wait(child3);
    wait(child4);
}
else if(child0<0)
{
    printf("fork() failed!n");
    exit(1);
}
else
{
cout<<"i am child0";
    exit(0);
}

每次分叉后,进程数量都会增加一倍。这是你的代码:

child1=fork(); // we have two now
child2=fork(); // each one of them forks - we have 4
child3=fork(); // 8
child4=fork(); // 16

您需要检查分叉的返回值。当它不为 0 时,您位于父级中,并且可以再次分叉。如果是0,你是孩子,你不应该fork() - 应该做你的孩子的家务。

当您检查返回值时,您不妨检查它是否有-1 - 这意味着fork()失败。尽管看起来难以置信,但我知道一个发生这种情况的生产系统。

永远记住 -- 当你执行fork()时,子进程和父进程都会再次从下一行fork()语句开始执行。 fork() 在子进程中返回 0,在父进程中返回子进程的 PID。因此,在您的情况下,孩子和父母都会再次分叉。您正在创建进程树。

所以以这种方式做

int pid;
if((pid=fork())==0)
{
  // Child Process
  printf("I'm child");
}
else
{
   // Parent process
   // Again do fork() here
}