fork 和 vfork 的区别

函数原型:

#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 系统都支持,故移植性不好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值