Linux基础之进程-fork()函数的详解

目录

一、前言

二、fork()函数

2.1 fork()函数的基本概念

2.2 问题一的解答

2.3 问题二的解答

2.4 问题三的解答

2.5 问题四的解答

2.6 问题五的解答


一、前言

       在上节内容中我们已经学会了使用我们的getpid()和我们的getppid()去查看我们进程的pid,并且学习到了两种查看进程的方式,在我们的正文开始之前,我先对上文的一些内容做一些补充。

       在第二种查看进程的方式中我们看到一个进程的详细信息:

即上图的右半部分,这里我们主要对其中的  cwd 和  exe 进行说明。
       我们经常会遇到一个概念,叫做文件的当前目录,那什么是当前目录呢,这是什么意思呢,子在进程中 cwd 就指向该进程的当前目录,其实就是在默认情况下,进程启动所在的路径,就是当前的工作目录。
       那 exe 又是什么呢,exe 指向的是可执行程序的位置。
       在Linux中我们可通过指令来修改当前的工作目录:

chdir  +  路径 :修改工作目录

二、fork()函数

2.1 fork()函数的基本概念+提出问题

       这里有一个问题,那就是如何去创建一个进程呢,最简单的方法就是执行我们的可执行程序,系统就会生成一个进程。我们还可以通过fork()这个函数在代码去主动去创建进程。

我们可以先用man指令查询一下这个函数:

       简单来说,fork()函数的作用就是创建一个当前进程的一个子进程。那我们要怎么理解去创建一个进程这样的一个概念呢?
       创建一个进程,其实就是系统申请内存,保存我们当前的可执行程序,生成其对应的一个PCB,并将该可执行程序及其PCB加入到我们的进程列表中。
       接下来就让我们先来看看fork()创建的进程有和特征。

      先写一段这样的代码,我们去观测一下该子进程的信息,至于为什么要这样写,我们等会再说,先跑起来看看。

我们会发现确实出现了两个进程,且其中一个进程的ppid是我们一个进程的pid。

       很明显,在我们的红色框框内第一个进程跟我们上节所讲的进程差不多,其父进程会是我们的命令行解释器。而这个第二个进程就应该是我们fork()函数所创建出来的子进程了。那我们再来看一段代码。

再来看看这段代码的运行结果。

       不难发现听音乐和下电影在同时运行,可是我们printf函数明明就只执行了一次为什么会输出两个不同的值,难道是我们的子进程继承了我们父进程的代码吗?就算是继承我父进程的代码,那我的fork()为什么会有两个返回值呢,这也太不符合我们之前所学了。那我们不妨把我们所有的问题全部抛出了一个一个解决。
        问题:

  1. fork()函数干了什么事,我们为什么要使用它?
  2. 为什么fork()函数会有两个不同的返回值?
  3. 为什么fork()的返回值会给父进程返回子进程的pid,而给子进程返回0?
  4. fork之后,子进程和父进程谁先执行?
  5. 如何去理解一个变量却又不同的返回值?

2.2 问题一的解答

       刚刚我们有讲,fork()函数的作用是创建了一个子进程,那这个子进程有什么用呢?
       我们创建子进程主要为了使用其有两个返回值的特性,来帮助我们实现多任务并行运行这一场景。举个例子,比如上文我们想边下载电影边听音乐的场景。可是我们新建出来的子进程按道理来说是不会有代码的,那其是如何满足我们的需求的呢?

       所以在fork之后,我们的父进程和我们的子进程会执行一样的代码,那这里可能就有人会问了,那fork之前的代码呢,子进程就不执行了吗? 是的,确实是不执行了,但是不是因为其看不到父进程的所有代码,而是子进程同样继承了父进程的寄存器。

2.3 问题二的解答

       问题又来了,为什么fork()会返回两个不同的值呢? 在上文我们有提到,一个进程是怎么被创建出来的,即当其可执行程序和PCB被加入到进程队列时,该进程就已经被创建成功了,那这个时候,fork()函数有没有结束呢? 没有,只能说其创建进程的任务完成了,但其还又一个语句没有执行呢,什么呢,那就是return。再回答第一个问题的时候我们就有提到,子进程会继承父进程的寄存器,那么此时寄存器是不是指向的是return语句呢? 很显然是的,那么父进程返回一个值,子进程返回一个值,不就有两个返回值了吗? 放张图,加深一下理解。

2.4 问题三的解答

为什么fork()的返回值会给父进程返回子进程的pid,而给子进程返回0呢?
这是因为父进程它很有可能不只有一个子进程,那其要是想对它的子进程进行管理该怎么做呢?那肯定是要根据其子进程的标识符呀,那么进程的标识符是什么呢,就是其pid。给自己的返回自己的pid没什么意义,所以fork就给子进程返回0。

2.5 问题四的解答

       创建完成子进程,这仅仅是一个开始,创建完成子进程之后,系统的其他进程,父进程,子进程都等着被系统调度执行。当父子进程的PCB都被创建且都在运行队列(操作系统会把其将要执行的代码放入一个队列中进行排队,这个队列就叫运行队列)中排队的时候,哪个进程先被调度,那个进程就先被执行。但是这个调度顺序是不确定的,由操作系统本身决定,由各自PCB中的调度信息(时间片、优先级等)+ 调度器算法共同决定的。

2.6 问题五的解答

为什么有两个返回值我们已经知道了,但是为什么这两个返回值不相同呢?
       这里就要提到,进程的独立性,其独立性首先就体现在各自的PCB是不会相互影响的。虽然父子进程共享代码,但是代码是只读的,无法被修改。但是数据却是可以被修改的,如果存在一个全局变量,我父进程需要根据这个全局变量作为判断条件,而我的子进程却会修改这个全局变量,那这不就影响到了我们的父进程了吗?所以数据每个进程都得想办法私有一份,怎么私有都拷贝下来吗,如果代码量很大的话,拷贝的代价就有点大了,而我们的操作系统是不会允许这样降低效率的事情发生的,那么我们该怎么办呢?
       这里主要是使用到了写时拷贝的方法,父子进程还是一样的共享代码,只有当自己要修改其中的某个变量时,才把这个变量拷贝过来,以达到不会相互影响的状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FastAPI:Python打造高效API的终极武器

在Python的世界里,如果你想要一个既快速又现代的方式来构建API,那么FastAPI可能是你的首选。这个库基于Starlette(用于Web编程)和Pydantic(用于数据验证),专门为速度和易用性设计。 什么是FastA…

【系统架构师】-案例篇(三)NoSQL与分布式对象调用

1、NoSQL 一个基于Web 2.0的大型社交网络系统。就该系统的数据架构而言,李工决定采用公司熟悉的数据架构,使用通用的商用关系型数据库,系统内部数据采用中央集中方式存储。该系统投入使用后,初期用户数量少,系统运行平…

【LeetCode】每日一题 2024_5_13 腐烂的橘子(经典多源 BFS)

文章目录 LeetCode?启动!!!题目:找出不同元素数目差数组题目描述代码与解题思路 每天进步一点点 LeetCode?启动!!! 好久没写每日一题题解了,今天重新起航 干…

U盘打不开无法使用

我一个U盘通过window无法识别了,属性也打不开; 我这时候通过挂载U盘到我的centos虚拟机上,打开后,将其挂载 如有需要备份其中的文件 fdisk -L blkid mount /dev/sdc4 /UP cp -r /UP /opt/ umout /UP mkfs.xfs -f /dev/sdc4…

AI与边缘设备,光子芯片,AI规划能力,自然语言驱动的AI游戏

1 Archetype AI 发布了一个创新的人工智能平台 —— Newton 这是一个专门为理解物理世界设计的基础模型。 Newton 设计用于连接实时物理数据,其数据源是全球数十亿传感器的输入,实现了对物理现实的直接解读。 利用从各种传感器(如加速度计…

thinkphp8 framework和 element plus admin前后端分离系统之PHP安装教程

DIYGW-UI-PHP是一款基于thinkphp8 framework和 element plus admin开发而成的前后端分离系统。目的是结合现有diygw-ui打造一个后台API开发。 实现PHP源码前请先下载小皮面板或者宝塔。 系统已经集成了部分功能 用户管理 后台用户管理部门管理 配置公司的部门结构&#xff0…

248 基于matlab的GA-RBF神经网络预测

基于matlab的GA-RBF神经网络预测,遗传算法优化来训练RBF网络权值,RBF优化后的结果用于预测。输出真实值、RBF预测结果、GA-RBF预测结果,并进行对比。程序已调通,可直接运行。 248 RBF神经网络 GA-RBF 时间序列预测 - 小红书 (xiao…

银发经济背后百万亿市场,解析冷门暴利的中老年AI赚钱项目!

最近“银发经济”这个词频繁出现,如果你注意到了抖音被封号的“秀才”以及仍在活跃的“一笑倾城”这两个账号,你就会明白中老年赛道的前景是多么广阔。 《银发经济蓝皮书》数据显示,到目前为止,我国60岁及以上的老年人口已超过2.8…

扭蛋机小程序开发,探索扭蛋机市场的盈利趋势

近几年随着互联网科技的不断创新,扭蛋机又再一次进入到了大众的目光中,各种全新的“互联网扭蛋机”模式为大众打造了一个全新的扭蛋体验,市场规模也在不断扩大,为扭蛋机商家和创业者提供了巨大的发展空间。本文将介绍“互联网扭蛋…

夜莺监控(Nightingale)上线内置指标功能

Prometheus 生态里如果要查询数据,需要编写 promql,对于普通用户来说,门槛有点高。通常有两种解法,一个是通过 AI 的手段做翻译,你用大白话跟 AI 提出你的诉求,让 AI 帮你写 promql,另一种是平台…

巩固学习6

正则表达式 又称规则表达式,Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为“元字符”&…

Uniapp 自定义弹窗

布局 <view><view v-if"show" class"popup"><view class"popup-box"><view>支付方式:{{way}}</view><view>停车费用:{{money}}</view><view class"btn-box"><view class"ca…

Spring高手之路18——从XML配置角度理解Spring AOP

文章目录 1. Spring AOP与动态代理1.1 Spring AOP和动态代理的关系1.2 AOP基本术语 2. 通过XML配置实现Spring AOP2.1 添加Spring依赖2.2 定义业务接口和实现类2.3 定义切面类2.4 配置XML 1. Spring AOP与动态代理 1.1 Spring AOP和动态代理的关系 Spring AOP使用动态代理作为…

Python从0到POC编写--基础

什么是EXP、POC、CVE&#xff1a; 在某个漏洞出现的时候&#xff0c;会经常看到 exp啊&#xff0c;poc啊什么鬼的&#xff0c; 那么这些究竟是什么东西&#xff1f;&#xff1f; 余弦大大说&#xff1a; POC 即 Proof Of Concept&#xff0c;观点验证程序。 运行这个程序就…

【Linux系统编程】第十七弹---进程理解

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、进程的基本概念 2、描述进程-PCB 2.1、什么是PCB 2.2、为什么要有PCB 3、task_ struct 3.1、启动进程 3.2、创建进程…

基于微信小程序的预约挂号系统(源码)

博主介绍&#xff1a;✌程序员徐师兄、10年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447…

Ubuntu20.04右键打不开终端

今天用virtualbox安装了ubuntu20.04 问题&#xff1a;右键打开终端&#xff0c;怎么也打开不了&#xff01; 点了也没反应&#xff0c;或者鼠标转小圈圈&#xff0c;然后也没有反应… 解决方法&#xff1a; 1、Ctrl Alt F6 先切换到终端访问界面 mac电脑 Ctrl Alt F6 …

vuerouter声明式导航

声明式导航-跳转传参数 1.查询参数传参 语法&#xff1a;to /path?参数名值 2.对应页面组件接受传来的值 $router.query.参数名 2.动态路由传参 1.配置动态路由 2.配置导航连接 to/path/参数值 3.对应页面组件接收传递过来的值 #route.params.参数名 多个参数传递&…

情感感知OCR:整合深度学习技术提升文字识别系统的情感理解能力

摘要&#xff1a;随着深度学习技术的发展&#xff0c;文字识别&#xff08;OCR&#xff09;系统在识别准确率和速度上取得了长足的进步。然而&#xff0c;在处理文本时&#xff0c;仅仅依靠字符和词语的识别并不足以满足用户对信息的全面理解需求。本文提出了一种新颖的方法&am…

Redis五大基本数据类型介绍及其使用场景

文章目录 1 String&#xff08;字符串&#xff09;应用场景 2 List&#xff08;列表&#xff09;应用场景 3 Set&#xff08;集合&#xff09;4 sorted set&#xff08;有序集合&#xff09;应用场景 5 hash&#xff08;哈希&#xff09;应用场景 Redis 是一个开源&#xff0c;…