gpt4 book ai didi

linux - vfork() 之后如何恢复父级

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:15 28 4
gpt4 key购买 nike

因为 vfork 在与父进程相同的地址空间中创建子进程,当在子进程上调用 execv() 时,父进程如何恢复,因为 exec 加载文件并在相同的地址运行它 parent 和 child 的空间?

最佳答案

execv 遵循一个真正的 vfork 时,它会完成一些 fork 的工作:它分配一个新的内存空间来加载新的程序镜像并将环境变量等可继承的东西复制到其中。同时,甚至 vfork 也会在旁边保存一点父级的状态,以便 execv 可以在子级分离后恢复父级的堆栈和指令指针。

例如,在 Linux 上 vfork通过 _do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, ...) 调用通用进程复制代码。 copy_mmCLONE_VM 使用react,只是重用内存空间而不调用 dup_mm_do_fork同时响应CLONE_VFORK,标记子vfork_done,并挂起调用者直到内存空间不再被使用;如果这是通过 execve ,它通过 exec_mmapmm_release,它看到 vfork_done 并唤醒父进程。

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

关于linux - vfork() 之后如何恢复父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47564451/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com