1

我正在跟踪 glibc 2.17 和 glibc 2.27 中的 posix_spawn 源代码。

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

(glibc 2.27:sysdeps/unix/sysv/linux/spawni.c)

我发现 glibc 2.17 根据标志和文件操作使用 vfork 或 fork。

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

但在 glibc 2.27 中,它只使用 vfork 创建子进程。

为什么 glibc 会改变实现?

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

4

1 回答 1

2

vfork对于大型进程来说,它的效率要高得多fork,因为地址空间根本不需要复制。最初,有人担心正确的取消处理需要在fork存在文件操作的情况下使用,但最终确定vfork基于 current 的实现是足够的。

vfork在 qemu-user 和微软的仿真中还是有问题的,但是在使用的时候bug通常是不可见的,posix_spawn因为它实际上并没有使用vfork,而是一个带有单独堆栈的vfork-styleclone系统调用,这样即使父进程没有正确暂停,孩子的堆栈没有被破坏。

一些具有背景信息的资源:

于 2018-07-20T07:40:03.300 回答