我有一个父进程,我想从中创建4个子进程,其中2个子进程各有一个子进程。
我能够从父级创建4个子进程。但是当我尝试为2个子进程创建子进程时,我有一个无限循环。 我使用循环来创建4个进程,并添加了一个条件,即在创建第二个子进程和第四个子进程时,为每个进程创建一个子进程。
来源:
#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;
}
答案 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
的二进制表示的最低位。