函数原型:
#include <unistd.h>
pid_t fork(void)
pid_t vfork(void)
返回值:子进程返回0,父进程返回子进程ID;若出错,返回-1
相同点:
- 函数的返回值相同,都是子进程返回0,父进程返回子进程ID
- 继承父进程的属性相同:实际用户id、实际组id、有效用户id、有效组id;附属组id;进程组id;会话id、控制终端;当前工作目录;根目录;文件模式创建屏蔽字;信号屏蔽和安排;环境;对任一打开文件描述符的执行时关闭等
不同点:
- fork 把父进程的地址空间复制到子进程中(数据段、代码段、堆和栈),采用的是写时复制技术;而vfork, 产生的子进程会立即调用exec(系列函数)或 exit, 不回引用该地址空间。不过在调用 exec 或 exit 函数之前,它在父进程的地址空间上运行。
- fork 不能保证父子进程哪个先运行,这个有系统调用和调度方法决定;而 vfork 保证子进程先运行,在它调用 exec 或 exit 之后父进程才可能被调度运行。
注意:
调用 vfork 时,如果子进程修改数据(除了用于存放 vfork 返回值的变量)、进行函数调用、或者没有调用 exec 或 exit 就返回都有可能带来未知的结果。而且 vfork 不是所有的 unix 系统都支持,故移植性不好。