3

考虑代码:

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>

/* main --- do the work */

int main(int argc, char **argv)
{
    pid_t child;

    if ((child = fork()) < 0) {
        fprintf(stderr, "%s: fork of child failed: %s\n",
            argv[0], strerror(errno));
        exit(1);
    } else if (child == 0) {
                    // do something in child
            }
    } else {
    // do something in parent
    }
}

我的问题是子进程在代码中从哪里开始执行,即首先执行哪一行?如果它执行整个代码,它也会创建自己的子进程,事情会继续发生,这肯定不会发生!!!

如果它在 fork() 命令之后开始,它首先如何进入 if 语句?

4

5 回答 5

7

当你执行一个fork()线程时,线程被复制到内存中。

因此,实际发生的情况是,您将有两个线程执行您发布的代码段,但它们的fork()返回值会有所不同。

因为子线程fork()将返回0,所以if不会执行另一个分支,父线程也会发生同样的事情。

fork()被调用时,操作系统为将要产生的新线程分配一个新的地址空间,然后启动它,它们将共享相同的代码段,但由于返回值不同,它们将执行代码的不同部分(如果正确拆分,例如您的示例)

于 2012-04-16T16:04:57.510 回答
7

它在 fork 函数的返回中开始执行子进程。不在代码的开头。fork在父进程中返回子进程的pid,在子进程中返回0。

于 2012-04-16T16:05:01.497 回答
2

孩子开始执行 fork 之后的下一条指令(不是行)。因此,在您的情况下,它是将 fork 的返回值分配给子变量。

于 2012-04-16T16:06:08.040 回答
0

好吧,如果我正确理解你的问题,我可以告诉你,你的代码已经作为一个进程运行了。当你运行一个代码时,它已经是一个进程,所以这个进程无论如何都会执行 if 语句。在 fork() 之后,您将拥有另一个进程(子进程)。

在 Unix 中,一个进程可以创建另一个进程,这就是发生这种情况的原因。

于 2012-04-16T16:11:40.713 回答
0

子进程中的代码执行从fork()系统调用之后的下一条指令开始。

fork()系统调用只是为子进程创建一个单独的地址空间,因此它是父进程的克隆副本,并且子进程具有其父进程的所有内存元素

因此,在通过 fork() 生成子进程后,两个进程(父进程和子进程)都会从系统调用之后的下一条指令恢复执行fork()

于 2021-02-11T19:01:51.487 回答