目录

1、fork是什么

2、 fork复制原理

3、逻辑地址与物理地址

4、计算fork()输出次数


1、fork是什么

  • linux下创建新进程的系统调用的是fork(),其定义如下:
  • ​​​​​​​#include<sys/types.h>
    #include<unistd.h>
    pid_t fork(void);
  • fork函数的功能就是复制当前进程,在内核进程表中创建一个新的进程表象,该进程称为子进程,被复制的进程称为父进程
  • 子进程的代码和父进程的完全相同,同时它还会复制父进程的数据(堆数据、栈数据和静态数据)。数据的复制采用的是写时复制。此外,创建子进程后,父进程打开的文件描述符默认在子进程中也是打开的,且文件描述符的引用计数+1。

2、 fork复制原理

  • 父进程有pcb,父进程内调用fork()函数,fork复制一份父进程的pcb,然后申请一个PID,把子进程的pcb里的pid的加1,父进程的返回值为子进程的pid,子进程的返回值为0,如下图所示:
  • 总结:
    • 子进程的PID=父进程的PID+1
    • 父进程的返回值为子进程的PID,子进程的返回值为0。该返回值是后续代码判断当前进程是父进程还是子进程的依据。fork调用失败返回-1,并设置errno

3、逻辑地址与物理地址

  • 父进程fork后产生的子进程,逻辑地址一致,物理地址不一致
  • 在进程中看到的地址都是逻辑地址
  • 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,分配的是逻辑地址。要使用地址时再去寻找空闲的地址——物理地址。
  • 有些时候,父子进程的某个变量的输出地址可能相同,只可能是其逻辑地址相同,要想知道它们在内存中的物理地址,就必须根据逻辑地址判断页表号(如下图所示),再根据各自的页表进行映射,找到其在内存中的具体位置——物理地址。不同进程的逻辑地址没有可比性,但是如果在同一个进程中,若地址相同,那就证明其在同一段物理内存中。

4、计算fork()输出次数

例题分析——打印几个A?

  • 解:
  • 去掉"\n"

  • 有\n 直接打印
  • 没有\n 放在缓冲区内
  • 在该例中,输出结果为BAA
  • 分析:
    • main函数内第一句,把A放到缓冲区,然后打印B, fork又把复制一次,两个缓冲区的A都被打印出来,因此输出结果依次为BAA

【Linux】fork()相关推荐

  1. Linux的fork实现原理,【Linux】Fork炸弹详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 众所周知,bash是一款极其强大的shell,提供了强大的交互与编程功能.这样的一款shell中自然不会缺少"函数"这个元素来帮助程序 ...

  2. 【Linux】fork之后,子进程继承了父进程哪些内容

    父进程经过fork()以后,父进程和子进程拥有相同内容的代码段.数据段和用户堆栈,就像父进程把自己克隆了一遍.事实上,父进程只复制了自己的PCB块.而代码段,数据段和用户堆栈内存空间并没有复制一份,而 ...

  3. 【Linux】一步一步学Linux——初识Linux命令解析器(10)

    00. 目录 文章目录 00. 目录 01. Shell简介 02. Shell分类 03. 交互式shell和非交互式shell 04. 登录shell和非登录shell 05. Shell类型 0 ...

  4. 【Linux】3.0Linux进程概念

    文章目录 1.冯诺依曼体系结构 1.1计算机体系的奠基人 1.2冯诺伊曼体系讲解 1.3机器间的数据交互 2.操作系统(OS) 2.1操作系统基本概念 2.2操作系统管理理解 2.3操作系统进程管理 ...

  5. 【Linux】基础:进程的概念

    [Linux]基础:进程概念 摘要:本文的主要目的是理解进程的概念.文章通过介绍进程的管理方式来引入进程的概念,从而提出进程的理解--PCB与程序.然后对PCB内容进行详细介绍,并同时介绍了关于进程的 ...

  6. 【Linux】Supervisor使用详解

    [Linux]Supervisor使用详解 一.supervisor简介 ​ Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程 ...

  7. 【Linux】Linux网络编程(含常见服务器模型,下篇)

    上一篇文章:[Linux]Linux网络编程(含常见服务器模型,上篇). 高级嵌套字函数 前面介绍的一些函数(read.write等)都是网络程序里最基本的函数,也是最原始的通信函数.下面介绍一下几个 ...

  8. 【Linux】管道文件(有名管道、无名管道)

    [Linux]管道文件(有名管道.无名管道) 多进程编程的目的就是为了同时完成多个任务. 例如:一个产品,一个软件,需要n个进程同时执行才能完成,而这些进程之间一定是有所联系的. 因此:多进程工作时, ...

  9. 【Linux】进程控制(创建、终止、等待)

    环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:[Linux]欢迎支持订阅 相关文章推荐: [Linux]冯.诺依曼体系结构与操作系统 [Linux]进程理解与学习Ⅰ-进程概念 [ ...

最新文章

  1. 三台机器搭建MySQL一主二从
  2. CVPR 2019 | APDrawingGAN:人脸秒变艺术肖像画
  3. spartan6不能直接把时钟连到IO上
  4. python面向对象有什么用_Python 中的面向对象没有意义
  5. java comparator_【面试题】Java必考面试题全集(15)
  6. 不一样的ZTree,权限树.js插件
  7. 8th,Jan Time Shedule_1st Day
  8. D - Send a Table (UVA - 10820)
  9. 机器学习的数学基础书籍
  10. matlab pascal函数,pascal常用函数较全
  11. windows用户密码破解
  12. Environment 的使用
  13. 计算机内存占用过高,内存,教您电脑内存占用高怎么办
  14. python控制qq添加好友_QQ增粉秘籍:QQ添加好友被限制 突破规则日增粉1000+
  15. 华为cor—al10_华为荣耀cor_al10是 什么型号的手机
  16. 睡前做什么有助于睡眠,不妨试试这几个帮助睡眠小妙招
  17. .NET MVC第九章、Web Api Json序列化与反序列化
  18. UEFI开发探索94 – 迷宫小游戏
  19. ELSEVIER期刊论文投稿全流程实例讲解
  20. 如何撰写高水平的学术论文

热门文章

  1. Safe.Software.FME.Desktop/Server..v2017.0.17291+DNV Phast Safeti v6.51 DNV Technical公司的安全计算软件
  2. AutoIT3while循环语句
  3. 光模块自动测试系统软件,一种用于测试光模块的多通道自动测试方法及系统
  4. 普林斯顿ap计算机教材,ap微积分目录[普林斯顿版]
  5. 惠普光影精灵8和惠普光影精灵7 参数选哪个
  6. 手机NFC通信的安全车钥匙
  7. 抖音、快手、百度等105款App 遭通报
  8. Jenkins 流水线 获取git 分支列表_基于Jenkins的DevOps流水线实践教程|2020全新制作|端到端研发效能提升...
  9. 2012技术大战:移动支付之前沿
  10. LaTeX公式转成word公式(LaTeX公式转MathML / latex2mathml的使用)