vfork

vfork死循环分析

/***vfork.c***/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
   pid_t pid;
   pid = vfork();
   if(pid < 0){
      perror("fail to vfork");
      exit(1);
   }else if(pid == 0){
            printf("this is child\n");
            //exit(0);
            return 0;
         }
         else printf("this is parent\n");

   return 0;

}

运行上面这段代码:
运行结果
可以看到本该输出2行最终却无限输出!

如果将子进程中的return换成exit最终得到我们想要的输出结果。

————————————————————————————————

为什么 return 会挂掉而 exit 不会?

forkvfork的区别:

- fork创建的子进程复制父进程的地址空间类容,包括数据段和堆栈段。
- vfork创建的子进程与父进程共享地址空间,包括代码段、数据段和堆栈段。

vfork会保证子进程先运行,当子进程调用exec或者exit后父进程才接着往下执行。

在上面的程序中,由于子进程与父进程共享地址空间,当子进程结束时调用return时函数栈返回并被弹出。因此父进程结束时将无法返回,会再次调用main函数从而导致循环!而exit只会返回从而保证了父进程结束时能够正常返回。

以上分析可知vfork创建子进程省去了复制父进程地址空间的开销,大大的提高了运行效率,但是同时又存在潜在的危险。fork虽然不存在这个问题但是效率较低。因此之后fork用到了写时复制进行了优化,提高了安全性的同时也兼顾了效率!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值