我对vfork()的功能感到困惑。我读到在vfork()的情况下,父进程和子进程用于在它们之间共享页面。它不支持任何写入时复制功能。这意味着,如果子进程在其时间片期间进行了一些更改,那么当父进程返回时,所有这些更改都将对父进程可见。还提到,只有当子进程在创建后刚刚执行exec系统调用时,vfork()系统调用才有用。
比方说,子进程使用ls执行exec系统调用。现在,根据exec调用,ls程序将被加载到子进程的地址空间。现在,当父进程的时间片将启动时,它可能会有不同的指令在其PC上执行,这可能会导致该进程的行为不同。
有没有人能向我说明一下这个场景,vfork()调用在这种情况下有什么帮助?
发布于 2011-07-01 23:27:01
vfork()的要点不是为一个子节点分配一个新的地址空间,因为它会立即再次丢弃它。因此,vfork()省略了fork()中为该子进程创建新地址空间(页表和分配)的部分,而是设置了一个标志,execve()将该标志解释为在用新的可执行文件及其请求的初始堆( As )填充该进程之前,应该为该进程分配一个新的页表和堆栈。
发布于 2011-07-13 02:58:23
execve()释放当前进程的内存映射并分配新的内存映射。退出一个进程也会释放该进程的内存映射。
传统上,vfork()会挂起父进程,直到子进程停止使用父进程的内存映射。唯一安全的方法是通过execve()或_exit()。
比方说,子进程使用ls执行exec系统调用。现在,根据exec调用,ls程序将加载到子进程的地址空间。
实际上,ls将被加载到一个新的地址空间中,父进程的地址空间在子进程上被释放。
https://stackoverflow.com/questions/6549831
复制相似问题