代码执行在子进程中从何处开始?

bhu*_*hni 3 c linux fork process

考虑一下代码:

#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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

如果它在fork()命令之后启动,它是如何在if语句中进行的?

Jac*_*ack 7

执行时fork(),线程被复制到内存中.

所以有效的情况是你将有两个线程执行你发布的代码片段,但它们的fork()返回值会有所不同.

对于子线程fork()将返回0,因此if不会执行其他分支,父线程也会发生同样的事情.

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


小智 7

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