Linux kernel 为什么较新的glibc使用vfork而不是fork实现posix_spawn?
我正在跟踪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 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
较新的linux内核是否能更好地保护vfork不受竞争条件的影响?
vfork
对于大型进程来说比fork
更有效,因为地址空间根本不需要复制。最初,有人担心,如果存在文件操作,正确的取消处理将需要使用fork
,但最终确定当前基于vfork
的实现是足够的
在qemu用户和微软的仿真中,vfork
仍然是被破坏的,但是当使用posix_spawn
时,这些bug通常是看不见的,因为它实际上并没有使用vfork
,而是使用一个带有单独堆栈的vfork
风格的克隆系统调用,因此即使父进程没有正确暂停,子对象中的堆栈未被碰撞
包含背景信息的一些资源:
- (加上后续审查线程)
- (同样地)
- (讨论暴露
vWork
仿真错误的断言)
- (同样地)
您可能会发现您的答案是好的,但我想清楚地了解,如果存在文件操作,为什么glibc 2.17会使用fork,为什么glibc 2.27不会使用fork。