linux - 为什么在 fork 后立即调用 exec() 的子进程不需要父地址空间的单独副本?

标签 linux linux-kernel

我正在阅读 Robert Love 的“Linux 内核开发,第二版”。 (是的,它有点过时了)。我从第 3 章:进程管理中了解到,在 COW(写时复制)中,父进程和子进程共享父进程的地址空间,直到其中一个进程写入地址空间。这是为了防止父地址空间甚至没有被写入时不必要的重复。

但是,它提到如果子进程在 fork() 之后立即调用 exec(),则不需要复制父进程的地址空间和页面并作为单独的副本给 child 。那就是我迷路的地方。

根据手册,“exec() 系列函数用新的过程镜像替换了当前的过程镜像。”手册没有说明任何关于 exec() 为新的进程镜像创建新的地址空间。因此,如果子进程与其父进程共享地址空间,这是否意味着 exec() 会将可执行镜像加载到父进程的地址空间(与子进程共享)?

因为这意味着父进程的地址空间将被覆盖,我不明白在 fork() 之后执行 exec() 的子进程如何不需要要写入的其父地址空间的单独副本。我在这里遗漏了什么吗?

最佳答案

写时复制机制意味着,子进程中的任何修改都不会影响父进程

子进程调用 exec 也不异常(exception):它只改变子进程的地址空间,而不是父进程。

关于linux - 为什么在 fork 后立即调用 exec() 的子进程不需要父地址空间的单独副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37695684/

相关文章:

linux - 注册新网络设备的正确方法是什么?

c -/etc/shadow 上使用的是哪种加密方式?

linux - 如何将 Linux 服务器上的 Excel 文件转换为带分隔符的文本文件?

linux - wget : unable to resolve host address “www.cmake.org”

linux - Linux系统日志中看到的 "ptymonitor"是什么?

caching - D 状态中的用户进程导致使用 Linux 2.6.24 和 ARM 处理器的看门狗重置

linux-kernel - linux/module.h : No such file or directory

php - 使用cmd保存带有DATE的mySQL文件

linux - 如何在设备启动时在树莓派上自动执行程序?

linux - 在 CentOS 7 上将内核版本更新到 3.19