fork() 和 exec() 的区别

2025 年 4 月 29 日 | 阅读 3 分钟

计算机系统有两种模式:内核模式和用户模式。在内核模式下,程序可以直接访问内存和硬件资源。在用户模式下,程序不能直接访问硬件和内存资源。因此,内核模式比用户模式拥有更高的权限。UNIX 系统使用各种系统调用。Fork 和 exec 是其中的两个。在本文中,您将了解 fork() 和 exec() 之间的区别。但在讨论差异之前,您必须了解 fork 和 exec()。

什么是 fork()?

fork() 系统调用有助于创建进程。当一个进程使用 fork() 系统调用时,它会创建一个自身的副本。父进程是现有进程,子进程是新创建的进程。虽然,子进程与父进程相同。创建子进程时,父进程的状态(如打开的文件、地址空间和变量)会被复制到子进程。换句话说,子进程和父进程位于不同的物理地址空间。因此,父进程中的修改不会出现在子进程中。

什么是 exec()?

exec() 系统调用用于创建进程。当使用 exec() 函数时,当前运行的进程将被终止,并被新创建的进程替换。换句话说,调用 exec() 后只剩下新进程。父进程被关闭。此系统调用还会用子进程替换父进程的文本段、地址空间和数据段。

fork() 和 exec() 的主要区别

Difference between fork() and exec()

在这里,您将了解 fork() 和 exec() 的主要区别。fork() 和 exec() 之间的各种区别如下:

  1. 在 UNIX 操作系统中,fork 是一个允许进程复制自身的命令。然而,在 UNIX 操作系统中,exec 是一个通过替换现有进程来创建新进程的命令。
  2. fork() 创建的子进程与父进程相同。另一方面,exec() 创建子进程并用它替换父进程。
  3. 调用 fork() 后,会存在子进程和父进程。相比之下,调用 exec() 后只存在一个子进程。
  4. fork() 中,父进程和子进程位于不同的地址空间。另一方面,在 exec() 中,子进程的地址空间会替换父进程的地址空间。

fork() 和 exec() 的逐项比较

在这里,您将了解 fork() 和 exec() 的逐项比较。fork() 和 exec() 之间的各种逐项比较如下:

特点Fork()Exec()
定义它是一个允许进程复制自身的命令。它是一个通过替换现有进程来创建新进程的命令。
地址空间在 fork() 中,父进程和子进程位于不同的地址空间。在 exec() 中,子进程的地址空间替换了父进程的地址空间。
父进程调用 fork() 函数后,存在子进程和父进程。调用 exec() 后,只存在一个子进程。
结果fork() 创建的子进程与父进程相同。exec() 创建子进程并用它替换父进程。