如何在vfork()之后恢复父级

问题描述 投票:1回答:1

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

linux unix operating-system
1个回答
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创建的非共享空间的同时。

© www.soinside.com 2019 - 2024. All rights reserved.