6.3.11.9. vfork

6.3.11.9.1. 简介

vfork创建的子进程与父进程共享数据段,而且由vfork()创建的子进程将先于父进程运行。

  • 由vfork创造出来的子进程还会导致父进程挂起,除非子进程exit或者execve才会唤起父进程

  • 由vfok创建出来的子进程共享了父进程的所有内存,包括栈地址,直至子进程使用execve启动新的应用程序为止

  • 由vfork创建出来的子进程不应该使用return返回调用者,或者使用exit()退出,但是可以使用_exit()函数来退出

6.3.11.9.2. 源码分析

SYSCALL_DEFINE0(vfork)
{
  return _do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, 0,
      0, NULL, NULL, 0);
}

6.3.11.9.3. 与fork区别

  • fork子进程拷贝父进程的数据段、代码段,vfork子进程与父进程共享数据段

  • fork父子进程的执行次序不确定,vfork保证子进程先运行