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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在vfork()之后恢复父级相关的知识,希望对你有一定的参考价值。

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

答案

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创建的非共享空间的同时。

以上是关于如何在vfork()之后恢复父级的主要内容,如果未能解决你的问题,请参考以下文章

恢复后地图片段为黑色

父级恢复时 Qt::Tool 出现太快

RecyclerView 内容未使用片段父级的全宽

如何知道 vfork 函数中的父进程或子进程

在 Activity 内部,如何暂停 for 循环以调用片段,然后在按钮单击片段后恢复循环以重新开始

如何在android中使用底部导航视图时恢复片段状态?