fork与vfork的区别

对于fork函数:
一,fork()函数简介

函数原型:

    pid_t fork(void);//pid_t为int类型,进行了重载
    pid_t getpid();// 获取当前进程的 pid 值。
    pid_t getppid(); //获取当前进程的父进程 pid 值。
fork()函数的实质是一个系统调用(和write函数类似),其作用是创建一个新的进程,当一个进程调用它,完成后就出现两个几乎一模一样的进程,其中由fork()创建的新进程被称为子进程,而原来的进程称为父进程.子进程是父进程的一个拷贝,即子进程从父进程得到了数据段和堆栈的拷贝,这些需要分配新的内存;而对于只读的代码段,通常使用共享内存方式进行访问.


二,利用fork()函数创建父进程和子进程

代码:

 

 创建成功结果如下:


三,fork()函数的特性


fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:

在父进程中,fork返回新创建子进程的进程ID;
在子进程中,fork返回0;
如果出现错误,fork返回一个负值;
因此我们可以通过fork返回的值来判断当前进程是子进程还是父进程。(注: fork 调用生成的新进程与其父进程谁先执行不一定,哪个进程先执行要看系统的进程调度策略)

四,小总结:


    1.父子进程执行顺序不确定,统一由cpu调度
    2.父进程从main函数开始执行,子进程从fork的下一条指令开始执行
    3.父子进程有各自独立的地址空间,子进程会将父进程几乎所有的内容都拷贝一份;
    4.父进程先于子进程结束时,子进程就变成孤儿进程,同时在后台执行,子进程被init进程收养
      子进程先于父进程结束时,父进程需要(wait/waitpid)回收子进程产生的资源


    
对vfork函数:


一,vfork的特点 及其创建子进程:


①子进程必定先运行,等到子进程调用exit或者exec后,父进程才能运行
②父子进程共享空间(共享内存数据)
fork 是 创建一个子进程,并把父进程的内存数据copy到子进程中。父子进程谁先运行是随机的。
二,代码

 

代码结果:

 

两者的区别:


fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别:
1.  fork  ():子进程拷贝父进程的数据段,代码段
    vfork ( ):子进程与父进程共享数据段
2.  fork ()父子进程的执行次序不确定
    vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec
     或exit 之后父进程才可能被调度运行。
3.  vfork ()保证子进程先运行,在她调用exec 或exit 之后父进程才可能被调度运行。如果在
   调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值