UNIX中IF语句中的Fork()

UNIX中IF语句中的Fork(),unix,fork,Unix,Fork,我对fork()的理解是,一旦它创建了子进程,它就不知道在到达“fork()”之前存在的代码。 但是在if stations with multiple fork()中,似乎子进程正在进行参数计算,即使它在fork()创建者之前就已经存在了 例如: int main () { if((fork())==(fork())) printf ("Hello.\n"); printf ("Bye.\n"); return 1; } 包括父亲在内,总共有4个过程。在由另一个子进程创建的子进程(我

我对fork()的理解是,一旦它创建了子进程,它就不知道在到达“fork()”之前存在的代码。 但是在if stations with multiple fork()中,似乎子进程正在进行参数计算,即使它在fork()创建者之前就已经存在了

例如:

int main ()
{
if((fork())==(fork()))
   printf ("Hello.\n");

printf ("Bye.\n");
return 1;
}
包括父亲在内,总共有4个过程。在由另一个子进程创建的子进程(我称之为d)中,创建d进程的fork()是if语句中的第二个fork()

尽管d不熟悉第一个fork(),但据我所知,d进程计算0==0并打印“Hello”(输出肯定是正确的)。我有两个问题:

1.d进程如何能够到达创建此d进程的fork()之前的if语句中的第一个fork()(第二个)

2.如果第一个fork()只发生在由这个特定fork()创建的子进程(d的父进程)中,为什么我们在d进程中

我对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;
}
#包括
#包括
内部主(空)
{
pid_t a=fork();
pid_t b=fork();
如果(a==b)
printf(“你好。\n”);
printf(“再见”。\n”);
返回1;
}
在fork之后,有四个进程,原始进程有
a!=0&&b!=0
(和
a!=b
,因为它的两个子项是不同的),另外两个有
a
b
中的一个为零,第四个有
a==b==0
。最后一个是唯一一个
a==b
,因此运行条件
printf()
调用

我对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;
}
#包括
#包括
内部主(空)
{
pid_t a=fork();
pid_t b=fork();
如果(a==b)
printf(“你好。\n”);
printf(“再见”。\n”);
返回1;
}

在fork之后,有四个进程,原始进程有
a!=0&&b!=0
(和
a!=b
,因为它的两个子项是不同的),另外两个有
a
b
中的一个为零,第四个有
a==b==0
。最后一个是唯一一个
a==b
,因此运行有条件的
printf()
调用。

“一旦由它创建的子进程,它对在到达“fork()”之前存在的代码一无所知。”这是为什么/怎么回事?你能更详细地解释你的想法吗?我的理解是子进程应该开始在fork()之后的代码上运行,我认为它不应该对它之前的代码做任何事情。进程已经被克隆。它位于同一程序中的同一点,内存中的数据相同(除了
fork()
调用的返回值)。为什么它的历史将不可用,那么它将如何在新的过程中继续进行该计划?它会做什么?这些都是非常可靠的观点,我只是在学习这个对我来说是新的主题“一旦它创建了子进程,它对我们到达‘fork()’之前存在的代码一无所知”为什么/怎么会这样?你能更详细地解释你的想法吗?我的理解是子进程应该开始在fork()之后的代码上运行,我认为它不应该对它之前的代码做任何事情。进程已经被克隆。它位于同一程序中的同一点,内存中的数据相同(除了
fork()
调用的返回值)。为什么它的历史将不可用,那么它将如何在新的过程中继续进行该计划?它会做什么呢?这些都是很有说服力的观点,我只是在学习这个对meSo来说是新的学科,它记得在他被创造之前的状态下,第一个fork()(他的父亲fork())等于0?。它是否负责在if语句之后进行检查,即使我们通常不会在fork()之前回顾前面的代码?@BenJ,是的。在调用第二个
fork()
时,第一个的返回值存储在进程的内存或寄存器中的某个位置。(不管它是存储在命名变量中,还是作为未命名的临时值,该值都需要位于某个位置,以便进行比较)他有责任在if语句之后进行检查,即使通常我们不会在fork()之前回顾前面的代码?@BenJ,我不知道你那一秒是什么意思question@BenJ是的,它们都运行相同的代码,只是PID的
a
b
的值不同。您可以将类似于
printf(“%d%d\n”),(int)a,(int)b)
的内容放在
if
之前,您将看到它们得到的值。(当然,这只适用于命名变量,来自不同进程的输出行将被混合)因此,它记住,在他创建之前的状态中,第一个fork()(他的父亲fork())