在fork系统调用之后,在较低级别会发生什么?

Sha*_*dra 6 fork system-calls

我知道fork()在更高级别上做了什么.我想知道的是 -

  1. 只要有一个fork调用,就会跟随一个trap指令并控制跳转来执行fork"handler".现在,通过创建另一个地址空间和进程控制块来复制父进程,这个创建子进程的处理程序如何返回2个值,每个进程一个?

  2. 在什么时候执行fork会返回2个值?

简而言之,有人可以解释在拨打电话后在较低级别发生的逐步事件吗?

Ana*_*tts 1

这并不难,对吧 - fork() 系统调用的内核部分可以通过您提到的进程控制块来区分两个进程之间的区别,但您甚至不需要这样做。所以伪代码看起来像:

int fork()
{
    int orig_pid = getpid();

    int new_pid = kernel_do_fork();     // Now there's two processes

    // Remember, orig_pid is the same in both procs
    if (orig_pid == getpid()) {
        return new_pid;
    }

    // Must be the child
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑: 天真的版本正如您所描述的那样 - 它创建一个新的进程上下文,复制所有关联的线程上下文,复制所有页面和文件映射,然后将新进程放入“准备运行”列表中。

我认为您感到困惑的部分是,当这些进程恢复时(即当父进程从 kernel_do_fork 返回时,并且子进程第一次被调度时),它从函数的中间开始(即首先执行该进程 '如果')。这是一个精确的副本 - 两个进程都将执行该函数的后半部分。