UNIX中IF语句中的Fork()

时间:2019-02-12 22:17:20

标签: unix fork

我对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>

1 个答案:

答案 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的调用。