fork()与vfork()的区别

fork()与vfork()的区别

概述

1.fork():子进程拷贝父进程的数据段和代码段。
vfork():子进程与父进程共享地址空间。
2.fork():父子进程的执行次序不确定。
vfork():保证子进程先运行,在调用 exec 或 exit 之前与父进程数据是共享的。父进程在子进程调用 exec 或 exit 之后才可能被调度运行,如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

详解

fork()

函数原型:

pid_t  fork(void);
返回值为整型,参数为空。

调用fork 函数后会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程。在调用fork函数时,有一个值得注意的问题就是,子进程与父进程的并发问题,处理不当就会产生僵死进程,也就是父进程先与子进程一步结束,此时,子进程就将成为僵死进程,占用pid,解决方法就是父进程调用wait()函数,进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

fork返回值
在父进程中,fork() 返回新创建子进程的进程ID;
在子进程中,fork() 返回0;
如果出现错误,fork返回一个负值;  
getppid():得到一个进程的父进程的PID;
getpid():得到当前进程的PID;
*注意:fork()函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是
子进程,一个是父进程。在子进程中,fork()函数返回0,在父进程中,fork()返
回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还
是父进程。

vfork()

函数原型:

pid_t vfork(void);
返回值为整型,参数为空。

vfork()函数和fork()函数一样都是在已有的进程中创建一个新的进程,但它们创建的子进程是有区别的。
vfork的特点 — 创建子进程:
①子进程必定先运行,等到子进程调用exit或者exec后,父进程才能运行
②父子进程共享空间(共享内存数据)

vfork()返回值
成功:子进程中返回 0,
父进程中返回子进程 ID。pid_t为无符号整型。
失败:返回 -1

注:仅供参考!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值