|
|
1
1
这并不难-fork()syscall的内核部分可以通过进程控制块来区分两个进程之间的区别,正如您所提到的,但您甚至不需要这样做。所以伪代码看起来是:
编辑: 原始版本和您描述的一样——它创建一个新的进程上下文,复制所有关联的线程上下文,复制所有页面和文件映射,新进程被放入“准备运行”列表中。 我认为你感到困惑的部分是,当这些进程恢复时(即当父进程从内核\do \u fork返回,而子进程第一次被调度时),它从 中间的 函数(即执行第一个“if”)。这是一个 准确的 复制-两个进程都将执行函数的后半部分。 |
|
|
2
1
返回到每个进程的值是不同的。父/原始线程get是子进程的PID,子进程get是0。 Linux内核在x86上通过改变eax寄存器中的值来实现这一点。 copies the current thread 在父进程中。 |