Linux系统编程之fork与vfork的区别

fork与vfork都是创建一个进程,那么他们有什么不同呢?

先看fork

#include <sys/types.h>

#include <unistd.h>

pid_t fork (void ); //(pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中)
//成功则返回两次,父进程返回子进程的进程号(可以通过ps查看进程号),子进程返回0;错误返回-1。   
// geipid():获取当前的进程号  getppid()获取父进程的进程号

子进程是父进程的一个拷贝。(高级一点的Linux是写时拷贝)具体说, 子进程从父进程那得到了数据段和堆栈段,但不是与父进程共享而是单独分配内存。fork函数返回后,子进程和父进程都是从fork函数的下一条语句开始执行。但是具体是谁运行这个不知道。

vfork:创建的子进程与父进程共享数据段,而且由vfork()创建的子进程将先于父进程运行。
vfork 保证子进程先运行,在子进程没有调用exec或exit之前,父进程处于阻塞等待状态。在子进程调用exec 或exit 之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

具体两者区别

1 fork():子进程拷贝父进程的数据段,代码段. -----vfork():子进程与父进程共享数据段.

2.fork():父子进程的执行次序不确定.-----vfork():保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。

3 vfork()保证子进程先运行,在她调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

有了fork()函数,为什么要引入vfork()?

因为以前的fork当它创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源,然后将会有两种行为:

1.执行从父进程那里拷贝过来的代码段

2.调用一个exec执行一个新的代码段

当子进程执行exec调用时,前面的拷贝工作就是白费力气了,这种情况下,聪明的人就想出了vfork,它产生的子进程刚开始暂时与父进程共享地址空间(其实就是线程的概念了),因为这时候子进程在父进程的地址空间中运行,所以子进程不能进行写操作,一旦子进程执行了exec或者exit后,这个时候父子分家。此时vfork保证子进程先运行,在她调用exec或exit之后父进程才可能被调度运行。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值