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

时间:2012-04-16 15:59:16

标签: c linux process fork

考虑代码:

#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语句中进行的?

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:6)

执行fork()时,线程会复制到内存中。

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

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