我对fork()的了解是,一旦它创建了子进程,它对在到达“ fork()”之前已存在的代码一无所知。 但是,如果有多个fork()的语句看起来好像是子进程正在执行参数计算,即使它是在fork()创建者之前进行的。
例如:
int main ()
{
if((fork())==(fork()))
printf ("Hello.\n");
printf ("Bye.\n");
return 1;
}
包括父亲在内,总共有4个过程。在另一个子进程创建的子进程(我将其称为d)中,创建我们d进程的fork()是if语句中的第二个fork()。
即使第一个fork()对d来说并不熟悉,但据我了解,d进程计算出0 == 0并输出“ Hello”(输出肯定正确)。我有两个问题:
1。d进程如何甚至能够在创建此d进程的fork()之前的if语句中到达第一个fork()(第二个)?
2。为什么在这一点上我们在d进程中,如果第一个fork()仅在由该特定fork()(d的父级)创建的子进程中发生,那么它等于0? / p>
答案 0 :(得分:2)
我对fork()的了解是,一旦在其中创建的子进程不了解该点之前存在的代码,我们便会到达“ fork()”。
除了返回值fork()
之外,子代是父代的精确副本。这包括所有运行时状态,包括内存和CPU寄存器。这就是进程拥有的全部内存,因此它们可以“记住”相同的东西。
让我们这样重写程序:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
pid_t a = fork();
pid_t b = fork();
if (a == b)
printf ("Hello.\n");
printf ("Bye.\n");
return 1;
}
在分叉之后,有四个过程,原始过程有a != 0 && b != 0
(由于两个孩子是不同的,所以还有a != b
),另外两个有a
和{{1 }}为零,第四个为b
。最后一个是a == b == 0
所在的唯一一个,这样一个就可以运行条件a == b
的调用。