在运行ltrace -S由gcc(版本 5.4.0)编译的两个程序后,一个调用vfork(),一个调用fork(),我发现vfork()调用SYS_vforkwhilefork()调用SYS_clone。我找不到任何有关这个特定的行为在任何地方的任何信息(有消息说各的fork(),vfork()并且clone()由相应的命名来实现sys_通话,而其他消息来源说,所有的三个电话使用实施sys_clone)。
源代码:
#include<stdio.h>
main()
{
int pid;
pid=vfork();
}
Run Code Online (Sandbox Code Playgroud)
输出ltrace -S:
...
__libc_start_main([some stuff here] <unfinished ...>
vfork([more stuff] <unfinished ...>
SYS_vfork([more stuff])
--- SIGCHLD (Child exited) ---
Run Code Online (Sandbox Code Playgroud)
libc 使用SYS_vforkforvfork()
但不使用SYS_forkfor是否有原因fork()?我读过托马斯·尼曼的回答到
哪个文件在内核指定fork()的一样,vfork()...在使用sys_clone()系统调用,它说:
vfork()反过来是通过一个单独的CLONE_VFORK标志实现的,这将导致父进程休眠,直到子进程通过信号唤醒它。子进程将是父进程命名空间中唯一的执行线程,直到它调用exec()或退出。不允许孩子写入内存。相应的clone()调用可能如下: …