操作系统 - vfork:了解问题:.



我对vfork()的功能感到困惑。我读到,在vfork()的情况下,父进程和子进程用于在它们之间共享页面。它不支持任何写入复制功能。这意味着,如果子进程在其时间片期间进行了一些更改,则所有这些更改在返回时对父进程都是可见的。还提到,vfork() syscall 仅在子进程在创建后执行exec系统调用时才有用。

假设子进程使用 ls 执行exec系统调用。现在,根据exec调用,ls程序将被加载到子进程的地址空间上。现在,当父进程的时间片启动时,它可能要在其 PC 上执行不同的入侵,这可能会导致此进程的行为不同。

有人可以向我说明这种情况,在这种情况下,vfork()呼叫有何帮助?

vfork()的重点

不是为孩子分配一个新的地址空间,这会立即再次扔掉它。 因此,vfork()省略了fork()中为子项创建新的地址空间(页表和分配(的部分,而是设置了一个标志,execve()该标志解释为它应该在使用新的可执行文件及其请求的初始堆 (BSS( 填充进程之前为进程分配新的页表和堆栈。

>execve()释放当前进程的内存映射并分配新的映射。退出进程最终也会释放该进程的内存映射。

传统上,vfork()会挂起父进程,直到子进程停止使用父进程的内存映射。安全执行此操作的唯一方法是通过 execve()_exit() .

假设子进程执行 exec 系统调用 ls.现在,根据 exec 调用,ls 程序将被加载到 到子进程的地址空间。

实际上,ls将被加载到新的地址空间中,则父级的地址空间将在子级上释放。

最新更新