Linux kernel 为什么较新的glibc使用vfork而不是fork实现posix_spawn?

Linux kernel 为什么较新的glibc使用vfork而不是fork实现posix_spawn?,linux-kernel,fork,race-condition,glibc,vfork,Linux Kernel,Fork,Race Condition,Glibc,Vfork,我正在跟踪glibc2.17和glibc2.27中的posix_spawn源代码 (glibc 2.17:sysdeps/posix/spawni.c) (glibc2.27:sysdeps/unix/sysv/linux/spawni.c) 我发现Glibc2.17根据标志和文件操作使用vWork或fork 我猜这是由于多线程安全或竞争条件 但在Glibc2.27中,它只使用vWork创建子流程 为什么glibc要更改实现 较新的linux内核是否能更好地保护vfork不受竞争条件的影响?vf

我正在跟踪glibc2.17和glibc2.27中的posix_spawn源代码

(glibc 2.17:sysdeps/posix/spawni.c)

(glibc2.27:sysdeps/unix/sysv/linux/spawni.c)

我发现Glibc2.17根据标志和文件操作使用vWork或fork

我猜这是由于多线程安全或竞争条件

但在Glibc2.27中,它只使用vWork创建子流程

为什么glibc要更改实现


较新的linux内核是否能更好地保护vfork不受竞争条件的影响?

vfork
对于大型进程来说比
fork
更有效,因为地址空间根本不需要复制。最初,有人担心,如果存在文件操作,正确的取消处理将需要使用
fork
,但最终确定当前基于
vfork
的实现是足够的

在qemu用户和微软的仿真中,
vfork
仍然是被破坏的,但是当使用
posix_spawn
时,这些bug通常是看不见的,因为它实际上并没有使用
vfork
,而是使用一个带有单独堆栈的
vfork
风格的
克隆系统调用,因此即使父进程没有正确暂停,子对象中的堆栈未被碰撞

包含背景信息的一些资源:

  • (加上后续审查线程)
  • (同样地)
  • (讨论暴露
    vWork
    仿真错误的断言)
  • (同样地)

您可能会发现您的答案是好的,但我想清楚地了解,如果存在文件操作,为什么glibc 2.17会使用fork,为什么glibc 2.27不会使用fork。