如果陷入困境,在里面分叉

时间:2014-09-07 22:54:37

标签: c linux fork

如果我打电话会怎么样?

if (fork() == fork())
   //do something

父母双方和两个孩子是否都要参加声明,或者在这种情况下的程序是什么?

2 个答案:

答案 0 :(得分:6)

有两个叉子,你最终会得到四个过程:一个父母,两个孩子和一个孙子。

由于C不要求从左到右计算表达式,因此未定义两个叉子发生的顺序。最后,首先发生的事情并不重要,所以让我们先假装左fork()。当发生这种情况时,你最终会得到一个父母和一个孩子。父母将返回孩子的PID,孩子将获得0

让我们打电话给父A和孩子B。以下是左叉执行后这两个进程的样子:

A          if (<pidof B> == fork())
|
+--B       if (0 == fork())

现在每个人都会执行正确的分叉。两个过程变为四个。我们打电话给B的新生儿CA的新生儿D。同样,每个fork()调用将返回两个值之一:父进程中的新子PID,或子进程中的0。以下是我们的四个流程:

A          if (<pidof B> == <pidof D>)
|
+--B       if (0 == <pidof C>)
|  |
|  +--C    if (0 == 0)
|
+--D       if (<pidof B> == 0)

碰巧,流程C将是唯一通过if支票的人。

答案 1 :(得分:1)

尝试此实验:

#include<stdio.h>
#include <unistd.h>

int main(void)
{
  printf("beginning\n");

  if(fork() == fork())
    {
      printf("two are equal\n");
    }

  printf("done\n");

  return 0;
}

一个过程打印“开始”,四个打印“完成”,一个打印“两个相等”。这是否清楚了?