fork

一个现有进程可以调用fork创建一个新进程。
返回值:子进程中返回0,父进程返回子进程ID,出错返回零。

子进程是父进程的副本
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而 父进程中返回子进程ID。
子进程是 父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述 存储空间的"副本",这意味着父子进程间不共享这些存储空间。
UNIX将复制 父进程的 地址空间内容给子进程,因此,子进程有了独立的地址空间。在不同的UNIX (Like)系统下,我们无法确定fork之后是子进程先运行还是父进程先运行,这依赖于系统的实现。所以在移植代码的时候我们不应该对此作出任何的假设。

为什么fork会返回两次?
由于在复制时复制了 父进程的 堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在 父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。过程如下图。

在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
父进程的fork函数返回的值指向子进程的进程id, 因为子进程没有子进程,所以其fork函数返回的值为0.

调用fork之后,数据、 堆栈有两份,代码仍然为一份但是这个 代码段成为两个进程的共享代码段都从fork函数中返回,箭头表示各自的执行处。当父子进程有一个想要修改数据或者堆栈时,两个进程真正分裂。

fork的一个特性是父进程的所有打开文件描述符都被复制到子进程中。父子进程的每个相同的打开描述符共享一个文件表项。在fork之后处理的文件描述符有两种常见的情况:
1.父进程等待子进程完成。在这种情况下,父进程无需对其描述符做任何处理。当子进程终止后,子进程对文件偏移量的修改已执行的更新。
2. 父子进程各自执行不同的程序段。这种情况下,在fork之后,父字进程各自关闭他们不需要使用的文件描述符,这样就不会干扰对方使件描用文件述符。 这种方法在网络服务进程中经常使用。

父子进程之间的区别:

  1. fork的返回值
  2. 进程ID不同
  3. 具有不同的父进程ID
  4. 子进程的tms_utime、 tms_stime、 tms_cutime及tms_ustime均被设置为0
  5. 父进程设置的文件锁不会被子进程继承
  6. 子进程的未处理闹钟被清除
  7. 子进程的未处理信号集被设置为空集

fork调用失败的原因:

  1. 系统中有太多的进程
  2. 实际用户的进程数超过了限制

vfork函数

vfork用于创建一个新进程,而该新进程的目的是exec一个新程序。 vfork与fork都创建一个子进程,但它不将父进程的地址空间复制到子进程中,因为子进程会立即调用exec,于是不会存访问该地址空间。相反,在子进程调用exec或exit之前,它在父进程的空间中运行,也就是说会更改父进程的数据段、栈和堆。vfork和fork另一区别在于: vfork保证子进程先运行,在它调用exec或( exit)之后父进程才可能被调度运行。

在UNIX中将创建进程分成了两部分:

fork():在新的地址空间中创建进程,读入可执行文件
exec():开始执行

fork():通过拷贝当前进程创建一个子进程,子进程和父进程的区别仅仅在于PID(每个进程唯一)和PPID(父进程的进程号)和某些资源统计量
exec():函数负责读取可执行文件并将其载入地址空间开始运行

Linux的fork()使用写时拷贝(COW,copy-on-write)页来实现。内核并不复制整个进程地址空间,而是让父进程和子进程共享一个地址空间,而只要页面被共享,它们就不能被修改。
无论父进程和子进程何时试图写一个共享的页面,就产生一个错误,这时内核就把这个页复制到一个新的页面中并标记为可写。原来的页面仍然是写保护的:当其它进程试图写入时,内核检查写进程是否是这个页面的唯一属主;如果是,它把这个页面标记为对这个进程是可写的

fork()的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符

页表的机制相信大家都比较熟络了吧,这是内核管理内存的一种方法

vfork()除了不拷贝父进程的页表项外,vfork()和fork()功能相同:子进程作为父进程的一个单独的线程在他的地址空间里运行,父进程被阻塞,直到子进程退出exit()或执行exec()。子进程不能向地址空间写入。
总结就是
fork ():子进程拷贝父进程的数据段,代码段
vfork ( ):子进程与父进程共享数据段
fork ()父子进程的执行次序不确定
vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec
或exit 之后父进程才可能被调度运行。
vfork ()保证子进程先运行,在她调用exec 或exit 之后父进程才可能被调度运行。如果在
调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

【linux基础】fork与vfork相关推荐

  1. OS / Linux / clone、fork、vfork 与 pthread_create 创建线程有何不同

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的过程就是这些数 ...

  2. linux如何在C程序中使用exit,c语言exit和return区别,在fork和vfork中使用

    exit函数在头文件stdlib.h中. 简述: exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在main主函数中,则会退出函数并返 ...

  3. linux内核-系统调用fork、vfork与clone

    前面已经简要地介绍过fork与clone二者的作用于区别.这里先来看一下二者在程序设计接口上的不同: pid_t fork(void); int clone(int (*fn)(void *), vo ...

  4. Linux fork() 和 vfork()

    代码 #include <unistd.h> #include <sys/types.h> #include <iostream> #include <err ...

  5. Linux系统编程(vfork和fork)

    文章目录 前言 一.vfork讲解 二.vfork使用 三.exit和_exit 1.exit和_exit对比 2.在vfork中的使用 四.vfork和fork区别 总结 前言 本篇文章讲解vfor ...

  6. linux 内核 fork,《Linux内核分析》之分析fork函数对应的系统调用处理过程

    实验过程 [toggle hide="yes" title="实验过程" color="#f50000"] 1.在实验楼中shell终端依次 ...

  7. Linux基础知识学习()

    一.Linux的磁盘分区及目录 Linux的配置是通过修改配置文件来完成. 1.1.Linux磁盘分区 Linux可以将磁盘分为多个分区,每个分区可以被当做一个独立的磁盘使用,磁盘类型:主分区.扩展分 ...

  8. 进程创建函数fork()和vfork()

    Linux下使用fork()创建一个新的进程,该函数不需要参数,返回值是一个进程id.对于不同的对象,分别是:新建的子进程id(返回给父进程),0(返回给创建的子进程)或者-1(子进程创建失败,返回给 ...

  9. 20155301 滕树晨linux基础——linux进程间通信(IPC)机制总结

    20155301 滕树晨linux基础--linux进程间通信(IPC)机制总结 共享内存 共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,由IPC为进程创建的一个特殊地址范围,它将出现在 ...

最新文章

  1. 为什么 React Elements 会有 $$typeof 这个属性?
  2. 在Shell中使用alias
  3. 干货 | Elasticsearch7.X Scripting脚本使用详解
  4. HDU 2063 过山车【二分图最大匹配】
  5. 《中国人工智能学会通讯》——5.16 结 论
  6. 对接kafka_Kafka系列9:面试题是否有必要深入了解其背后的原理?我觉得应该刨根究底(上)...
  7. 超搞笑之仙桃有没有毛?
  8. Sinowal Bootkit 分析-中国红客网络技术联盟 - Powered by Discuz!
  9. java中对于框架的理解_接触Java项目一周后对一些基本框架的理解 | 学步园
  10. 【SSTFlashFlex51单片机烧录软件的使用方法】
  11. 软件工程造价是做什么的?
  12. Chrome的视频加速插件
  13. PQ分区魔术师v9.0 中文版
  14. dayjs格式化使用
  15. 开源软件 商业软件_如何销售开源软件
  16. eDRX中的Paging PH PTW PF PO时刻计算
  17. js判断苹果ios各类机型
  18. Wiredtiger 存储引擎概述
  19. 百度推广——搜索营销新视角(百度官方出品,俞敏洪、吴晓波、徐雷力荐!)
  20. 深入浅出Python元编程,不仅仅是Metaclass

热门文章

  1. 常用存储设备优缺点辨析
  2. linux下3G拨号上网
  3. javascript promises的使用
  4. java 获取手机联系人_Android 读取手机联系人、拨号、发送短信及长按菜单的操作...
  5. nosql数据库入门笔记一
  6. oracle添加外键约束
  7. 计算机组成原理VHDL语言实现16位ALU实验
  8. RAD Studio 10.4.1新的基于Chromium的Microsoft Edge浏览器的TEdgeBrowser控件用法
  9. FFmpeg4入门14:Linux下摄像头捕获并编码为h264
  10. FFMpeg.AutoGen+D2D解码并播放视频(含音频流)