由于vfork在与父节点相同的地址空间中创建子进程,并且在子节点上调用execv()时,父进程如何恢复,因为exec加载文件并在同一地址中运行它父母和儿童的空间?
答案 0 :(得分:1)
当execv
跟随真vfork
时,它执行fork
的一些工作:它分配一个新的内存空间来加载新的程序映像并复制可继承的东西,如环境变量进入它。同时,偶数vfork
会保留父节点的一些状态,这样execv
可以在子节点分离后恢复父节点的堆栈和指令指针。
例如,在Linux vfork
上通过_do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, ...)
调用常见的进程复制代码。 copy_mm
对CLONE_VM
作出反应,只是重用内存空间而不调用dup_mm
。 _do_fork
同时对CLONE_VFORK
作出反应,标记子vfork_done
,并暂停调用者直到内存空间不再使用;如果这是通过execve
,则会经过exec_mmap
和mm_release
,它会看到vfork_done
并唤醒父母。
所以,实际上,execve
(也称为copy_strings
)总是“分配一个新的内存空间并将环境变量复制到其中”;但是,在正常fork
之后,这是不可观察的,因为它与释放由fork
创建的非共享空间同时发生。