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

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

前言

大家好吖,欢迎来到 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小点我们知道 父子进程共享代码段 ,于是有了以下过程

7.一个变量怎么会有不同的内容?——>地址空间

  • 地址空间章节传送门
相关文章
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
334 1
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
4256 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
Java Linux Python
Linux环境下 代码java调用python出错
Linux环境下 代码java调用python出错
397 4
|
Linux Shell Python
9-7|salt代码在linux机子那个目录
9-7|salt代码在linux机子那个目录
|
Linux 开发者 Python
从Windows到Linux,Python系统调用如何让代码飞翔🚀
【9月更文挑战第10天】在编程领域,跨越不同操作系统的障碍是常见挑战。Python凭借其“编写一次,到处运行”的理念,显著简化了这一过程。通过os、subprocess、shutil等标准库模块,Python提供了统一的接口,自动处理底层差异,使代码在Windows和Linux上无缝运行。例如,`open`函数在不同系统中以相同方式操作文件,而`subprocess`模块则能一致地执行系统命令。此外,第三方库如psutil进一步增强了跨平台能力,使开发者能够轻松编写高效且易维护的代码。借助Python的强大系统调用功能,跨平台编程变得简单高效。
477 1
|
缓存 编译器 Linux
Linux内核开发流程指南 - 4. 编写正确的代码【ChatGPT】
Linux内核开发流程指南 - 4. 编写正确的代码【ChatGPT】
|
机器学习/深度学习 Linux 开发工具
Linux内核开发流程指南 - 5. 编写正确的代码【ChatGPT】
Linux内核开发流程指南 - 5. 编写正确的代码【ChatGPT】
|
Linux 索引 关系型数据库
|
9月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
990 1
二、Linux文本处理与文件操作核心命令
|
9月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
601 137