如果我打电话会怎么样?
if (fork() == fork())
//do something
父母双方和两个孩子是否都要参加声明,或者在这种情况下的程序是什么?
答案 0 :(得分:6)
有两个叉子,你最终会得到四个过程:一个父母,两个孩子和一个孙子。
由于C不要求从左到右计算表达式,因此未定义两个叉子发生的顺序。最后,首先发生的事情并不重要,所以让我们先假装左fork()
。当发生这种情况时,你最终会得到一个父母和一个孩子。父母将返回孩子的PID,孩子将获得0
。
让我们打电话给父A
和孩子B
。以下是左叉执行后这两个进程的样子:
A if (<pidof B> == fork())
|
+--B if (0 == fork())
现在每个人都会执行正确的分叉。两个过程变为四个。我们打电话给B
的新生儿C
和A
的新生儿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;
}
一个过程打印“开始”,四个打印“完成”,一个打印“两个相等”。这是否清楚了?