Fork (系统调用)

在计算机领域中,尤其是Unix类Unix系统操作系统中,fork是一种创建自身行程副本的操作。它通常是内核实现的一种系统调用。Fork是类Unix操作系统上创建进程的一种主要方法,甚至历史上是唯一方法。

概述

在多任务操作系统中,行程(运行的程序)需要一种方法来创建新进程,例如运行其他程序。Fork及其变种在类Unix系统中通常是这样做的唯一方式。如果进程需要启动另一个程序的可执行文件,它需要先Fork来创建一个自身的副本。然后由该副本即“子进程”调用 exec英语Exec (computing)系统调用,用其他程序覆盖自身:停止执行自己之前的程序并执行其他程序。

Fork操作会为子进程创建一个单独的定址空間。子进程拥有父进程所有内存段的精确副本。在现代的UNIX变种中,这遵循出自SunOS-4.0的虚拟内存模型,根据寫入時複製语义,物理内存不需要被实际复制。取而代之的是,两个进程的 虚拟内存页面英语Virtual memory pages可能指向物理内存中的同一个页,直到它们写入该页时,写入才会发生。在用fork配合exec来执行新程序的情况下,此优化很重要。通常来说,子进程在停止程序运行前会执行一小组有利于其他程序的操作,它可能用到少量的其父进程的数据结构

当一个进程调用fork时,它被认为是父进程,新创建的进程是它的孩子(子进程)。在fork之后,两个进程还运行着相同的程序,都像是调用了该系统调用一般恢复执行。然后它们可以检查调用的 返回值英语Return value确定其状态:是父进程还是子进程,以及据此行事。

fork系统调用在第一个版本的Unix就已存在[1],它借用于更早的 GENIE英语Project Genie 分時系統[2]Fork是标准化的POSIX的一部分。[3]