有人可以帮我理解 fork 在这种情况下是如何工作的吗?
Can someone help me understand how fork worked in this case?
我发现这个程序有点误导且难以理解:
int i=2;
int j=10;
int p;
while(--i && (p=fork())
{
if(p<0)
exit(EXIT_SUCCESS);
}
j=j+2;
if(p==0)
{
i=i*3;
j=j*3;
}
else
{
i=i*3;
j=j*2;
}
printf("pid=%d i=%d j=%d\n",getpid(),i,j);
此程序产生以下结果:
Parent: PIDHERE, i=0, j=24.
Child: PIDHERE, i=3, j=36.
但是为什么会发生这种情况呢?如果 parent 有 i=0 这意味着 while 被执行了两次,但这是否意味着创建了两个孩子而不是一个因为 while 有一个 fork() 语句?
另外,while 什么时候停止循环? (逻辑表达式与 fork() 混淆!)。
--i
预递减 i
。 while
第一次评估其条件时,它将看到 i
的值为 1
。第二次,它会看到 i
的值为 0
。因此,循环只会产生一个 child.
当 while
看到 i
是 0
(在 parent 中),或者如果 fork
returns 0
(在child中)。
由于预递减,while 循环本质上等同于:
i=1;
p=fork();
if(p<0)
return 0;
else if(p)
i=0;
fork()
只调用一次。
我发现这个程序有点误导且难以理解:
int i=2;
int j=10;
int p;
while(--i && (p=fork())
{
if(p<0)
exit(EXIT_SUCCESS);
}
j=j+2;
if(p==0)
{
i=i*3;
j=j*3;
}
else
{
i=i*3;
j=j*2;
}
printf("pid=%d i=%d j=%d\n",getpid(),i,j);
此程序产生以下结果:
Parent: PIDHERE, i=0, j=24.
Child: PIDHERE, i=3, j=36.
但是为什么会发生这种情况呢?如果 parent 有 i=0 这意味着 while 被执行了两次,但这是否意味着创建了两个孩子而不是一个因为 while 有一个 fork() 语句?
另外,while 什么时候停止循环? (逻辑表达式与 fork() 混淆!)。
--i
预递减 i
。 while
第一次评估其条件时,它将看到 i
的值为 1
。第二次,它会看到 i
的值为 0
。因此,循环只会产生一个 child.
当 while
看到 i
是 0
(在 parent 中),或者如果 fork
returns 0
(在child中)。
由于预递减,while 循环本质上等同于:
i=1;
p=fork();
if(p<0)
return 0;
else if(p)
i=0;
fork()
只调用一次。