如何在vfork()

时间:2017-11-30 01:20:35

标签: linux unix operating-system

由于vfork在与父节点相同的地址空间中创建子进程,并且在子节点上调用execv()时,父进程如何恢复,因为exec加载文件并在同一地址中运行它父母和儿童的空间?

1 个答案:

答案 0 :(得分:1)

execv跟随真vfork时,它执行fork的一些工作:它分配一个新的内存空间来加载新的程序映像并复制可继承的东西,如环境变量进入它。同时,偶数vfork会保留父节点的一些状态,这样execv可以在子节点分离后恢复父节点的堆栈和指令指针。

例如,在Linux vfork上通过_do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, ...)调用常见的进程复制代码。 copy_mmCLONE_VM作出反应,只是重用内存空间而不调用dup_mm_do_fork同时对CLONE_VFORK作出反应,标记子vfork_done,并暂停调用者直到内存空间不再使用;如果这是通过execve,则会经过exec_mmapmm_release,它会看到vfork_done并唤醒父母。

所以,实际上,execve(也称为copy_strings)总是“分配一个新的内存空间并将环境变量复制到其中”;但是,在正常fork之后,这是不可观察的,因为它与释放由fork创建的非共享空间同时发生。