父进程有多个子进程和2子进程有一个子进程

时间:2015-11-05 13:32:34

标签: c fork

我有一个父进程,我想从中创建4个子进程,其中2个子进程各有一个子进程。

我能够从父级创建4个子进程。但是当我尝试为2个子进程创建子进程时,我有一个无限循环。 我使用循环来创建4个进程,并添加了一个条件,即在创建第二个子进程和第四个子进程时,为每个进程创建一个子进程。

  • 父母有(child1 chil2 child3 child 4)
  • Child2有(孩子5孩子6)

来源:

#include <stdio.h> 
#include <unistd.h> 
#include <sched.h> 
#include <sys/time.h> 
#include <sys/resource.h> 

int main(int argc, char **argv)
{ 
    int i; 
    for(i = 0; i <= 3; i++) 
    { 
        if(fork() == 0)
        {
            printf("process %d and his parent is %d \n",
                getpid(), getppid());

            if(i = 1)
            {
                if(fork() == 0)
                {
                    printf("process %d and his parent is %d \n",
                        getpid(), getppid());
                    break;
                }
            }
        }
    }

    return 0;
}

2 个答案:

答案 0 :(得分:0)

两个问题。第一:

if(i = 1)

您正在使用=这是一个分配,而不是==,它会比较相等。这里实际发生的是i被赋值为1,而值(1)在布尔上下文中被评估,这总是正确的。因此,每个孩子都会进入if区块并分叉自己的孩子。

改为使用比较运算符,如果您希望第二个和第四个孩子也i,还要检查fork是1还是3:

if ((i == 1) || (i == 3))

其次,在if(fork()==0)块的末尾,子进程继续进行for循环的下一次迭代。因此每个孩子都会调用循环和分叉的父行为。这导致创建的进程比预期的要多得多。

您需要在此块的末尾添加exit语句。另外,请#include <stdlib.h>确定exit

的定义
if (fork()==0)
{
    ...
    exit(0);
}

另一件有用的事情:在循环结束时,让所有孩子的父wait完成。否则,它可能会exit在其子女和子女报告过程`作为父母

之前

所以在这些修复之后,代码看起来像这样:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/resource.h>

int main(int argc, char **argv)
{
    int i;
    for(i = 0; i <= 3; i++)
    {
        if(fork() == 0)
        {
            printf("process %d and his parent is %d \n",
                getpid(), getppid());

            if ((i == 1) || (i == 3))
            {
                if(fork() == 0)
                {
                    printf("process %d and his parent is %d \n",
                        getpid(), getppid());
                    exit(0);
                }
                while (wait(NULL) != -1);
            }
            exit(0);
        }
    }
    while (wait(NULL) != -1);

    return 0;
}

答案 1 :(得分:0)

您要将值1分配给i而不是比较。

if(i = 1)

应该是

if(i == 1)

如果您打算测试i和值1的相等性。当i始终设置为值1时,分配给循环控制变量会创建无限循环。

但是,根据您的说明,您要为4个初始子进程中的第二个和第四个创建子进程,这还不能完成您的目标。

考虑到4个原始孩子的限制,你可以写

if((i & 1) != 0)

对值{1}和true进行求值,其值为i的二进制表示的最低位。