代码之家  ›  专栏  ›  技术社区  ›  Sharat Chandra

在fork系统调用之后,底层会发生什么?

  •  6
  • Sharat Chandra  · 技术社区  · 16 年前

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

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

    2. fork在什么执行点返回2个值?

    简而言之,Anbody能否解释一下在fork调用后在较低级别发生的分步事件?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Ana Betts    16 年前

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

    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;
    }
    

    编辑: 原始版本和您描述的一样——它创建一个新的进程上下文,复制所有关联的线程上下文,复制所有页面和文件映射,新进程被放入“准备运行”列表中。

    我认为你感到困惑的部分是,当这些进程恢复时(即当父进程从内核\do \u fork返回,而子进程第一次被调度时),它从 中间的 函数(即执行第一个“if”)。这是一个 准确的 复制-两个进程都将执行函数的后半部分。

        2
  •  1
  •   Robert Christie    16 年前

    返回到每个进程的值是不同的。父/原始线程get是子进程的PID,子进程get是0。

    Linux内核在x86上通过改变eax寄存器中的值来实现这一点。 copies the current thread 在父进程中。