《UNIX环境高级编程》(fork和vfork)

《UNIX环境高级编程》(fork和vfork)

fork

  • 声明
    这里写图片描述

  • 特性

    1. 调用fork可以创建一个新的进程;

    2. fork有两个返回值:
      返回0给子进程(原因是每个进程只有一个父亲,子进程可以通过getppid去得到父进程的ID,进程ID 0是预留给内核使用的,所以子进程的ID不可能是0);
      返回子进程的进程ID给父进程(一个进程可以有一个或多个子进程,但是没有API可以获取子进程的进程ID);

    3. 子进程是父进程的一份拷贝,子进程会复制父进程的数据空间、堆、栈。它们之间不会共享这部分的内容,它们只会共享正文段(正文段,你可以把它理解成代码段,相当于子进程拷贝了父进程的代码);
    4. 一般来说,fork之后,是父子进程先后执行的顺序是不确定的。这个取决于内核的调度算法;
  • 文件共享

    • 特性
      父进程所有打开的文件描述符都被复制到子进程中
    • fork之后常用的两种处理文件描述符的情况
      • 父进程等待子进程完成
      • 父子进程各自执行不同的程序段,通常用在网络服务进程中
  • fork失败的两个原因

    • 系统中有太多的进程
    • 该实际用户ID的进程总数超过了系统限制

vfork

  • 作用
    用于创建一个新的进程

  • 特性

    1. 调用序列和返回值与fork相同;
    2. vfork出来的子进程,不会将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit),所以就需要访问地址空间。但是在子进程调用exec(或exit)之前,它在父进程的空间中运行;
    3. vfork保证子进程先运行,当子进程执行完exec(或exit)后,父进程才会运行。但这有可能会造成死锁,比如,子进程里有依赖父进程的进一步的操作;

总结视图

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值