有人可以帮我理解 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 预递减 iwhile 第一次评估其条件时,它将看到 i 的值为 1。第二次,它会看到 i 的值为 0。因此,循环只会产生一个 child.

while 看到 i0(在 parent 中),或者如果 fork returns 0(在child中)。

由于预递减,while 循环本质上等同于:

i=1;
p=fork();
if(p<0)
    return 0;
else if(p)
    i=0;

fork() 只调用一次。