前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Linux系列】fork( )函数原理与应用详解——了解【父子进程及其特性】(代码演示,画图帮助理解,思维导图,精简)(11)

【Linux系列】fork( )函数原理与应用详解——了解【父子进程及其特性】(代码演示,画图帮助理解,思维导图,精简)(11)

作者头像
YY的秘密代码小屋
发布2024-02-05 16:18:50
2300
发布2024-02-05 16:18:50
举报
文章被收录于专栏:C++系列C++系列

前言 大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁 主要内容含:

一.前置知识——pid和ppid

1.系统调用接口查看pid,ppid

  • pid:当前进程
  • ppid:父进程
  • 每一次启动的进程, 系统会重新生成pid ,系统只保证当前生命周期内pid有效;
  • 但是 父进程不会变

2.为什么ppid父进程id不变?——bash命令行解释器与bash进程

  • 当我们运行一个进程时,命令行解释器会把这个指令解释成bash的子进程
  • 接着再由这个bash的子进程执行对应的命令
  • 当这个子进程出现问题时,并不影响bash的进程
  • 即:每一条命令被执行,都属于bash的子进程

  • 我们执行一段代码,parent对应的是getppid()函数;

我们接着用ps+grep过滤指令查看这个16815进程,发现其就是bash进程

二.fork( )函数原理与应用详解

1.fork()函数基本介绍

  • fork(): 创建子进程
  • 返回值给 【父进程返回子进程PID,给子进程返回0】

2.fork()返回值有两个:——>变成了两个进程(父子进程)——>实现两个死循环同时跑

  • 我们观察发现,他们不但生成了两个进程,而且还是父子进程关系
  • 由此我们得到了进程之间的 关系图

3.为什么fork要有两个返回值?

  • 返回不同的返回值,是为了 区分
  • 为了让fork以后的if判断while等,来让父子进程执行 不同 的代码片段

4.为什么fork要给子进程返回0,给父进程返回子进程pid?

  • 父进程要标记子进程,确保其 唯一性

5.fork函数究竟在干什么?————>父子进程共享代码段,各自拥有数据段(写时拷贝)

  • 进程=内核数据结构+代码和数据
  • 多了一个子进程,说明内存中一定会多出一个PCB供操作系统调度
  • fork出来的子进程,和父进程 共享同一个代码
  • 任何平台,进程在运行的时候,是具有 独立性
  • 因为数据 可能被修改 (一开始除外), 所以需要访问子进程的数据时 ,不能让他们共享数据;
  • 代码 不可以被修改 ,所以可以共享

  • 子进程需要访问数据时,单独开空间用多少,拷贝多少,进行了写时拷贝
父子进程共享代码段现象:fork以后的代码执行了两次

  • 先不调用fork函数,观察这段代码执行结果
  • 代码正常执行一次
  • 调用fork()以后:
  • 我们发现fork以后的代码 执行了两次

6.一个函数是如何做到返回两次的?——>父子进程共享return代码段

  • fork是一个函数, return语句 也属于 代码片段
  • 从5小点我们知道 父子进程共享代码段 ,于是有了以下过程
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-02-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.前置知识——pid和ppid
    • 1.系统调用接口查看pid,ppid
      • 2.为什么ppid父进程id不变?——bash命令行解释器与bash进程
      • 二.fork( )函数原理与应用详解
        • 1.fork()函数基本介绍
          • 2.fork()返回值有两个:——>变成了两个进程(父子进程)——>实现两个死循环同时跑
            • 3.为什么fork要有两个返回值?
              • 4.为什么fork要给子进程返回0,给父进程返回子进程pid?
                • 5.fork函数究竟在干什么?————>父子进程共享代码段,各自拥有数据段(写时拷贝)
                  • 父子进程共享代码段现象:fork以后的代码执行了两次
                • 6.一个函数是如何做到返回两次的?——>父子进程共享return代码段
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档