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

news2024/10/4 2:02:06

目录

一、前言

二、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.coloradmin.cn/o/1669977.html

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

相关文章

通过Mendix Portal管理应用整个生命周期

一、前言 大家常常会听到Mendix是一个统一的平台,怎么理解这个统一平台呢?它指的是帮助企业搭建一个统一的开发平台,管理应用的整个生命周期,之前大家更多地关注在应用开发层面,而开发只是整个生命周期的一环。 从上图…

华为手机恢复出厂设置后怎么还原数据?该如何预防数据丢失?

华为手机恢复出厂设置是将手机恢复到出厂时的初始状态,同时会删除所有用户数据和个人设置。如果不做任何预防措施,在恢复出厂设置后,您将丢失手机上的所有数据。那华为手机恢复出厂设置后怎么还原数据呢?以下是关于如何在华为手机…

柔性数组+结构体类型转换

柔性数组&#xff1a;在结构体中声明的时候仅作为占位符&#xff0c;好处是地址是连续的 强制类型转换&#xff1a;可用于通信双方进行信息交流 #include <iostream> #include <string.h>struct DataWater {int count;float size;char buf[0]; }; // dbuf相当于是…

GLU(Gated Linear Unit) 门控线性单元

文章目录 一、RNN二、GLU2.1 整体结构2.2 输入层(Input SentenceLookup Table)2.3 中间层(ConvolutionGate)2.4 输出层(Softmax)2.5 实验结果2.6 实现代码 三、RNN与GLU的对比参考资料 GLU可以理解为能够并行处理时序数据的CNN网络架构&#xff0c;即利用CNN及门控机制实现了RN…

UKP3d,修改管道长度或标高的方法

南京用户问&#xff0c;请问这个起末点标高可以修改么&#xff1f;如图&#xff1a; 上述起末点的标高是不可以修改&#xff0c;用户没有详细阐述自已想要的结果。可能是以下几种场景&#xff0c;希望能帮助到用户&#xff1a; 1.修改管道长度&#xff1a; 1.1.(管道在模型的…

各种类型的背景音频音效,不同风格的背景音乐素材

一、素材描述 本套背景音乐素材&#xff0c;大小1.76G&#xff0c;58个压缩文件。 二、素材目录 8支简短精致的企业标志片头音乐.zip Avril 伴奏收藏 Wish you were here.zip 《带我回家》带给人温暖感动的男声歌曲 .zip 《光荣时刻》震撼激烈的英雄史诗电影音乐素材.zip…

风扇开启执行逻辑

执行流程 public static void businessExecutionWork(){//以下为业务逻辑部分System.out.println("1、根据电池包控制风扇服务执行 开始!");//1、获取电池包电压、电流、环境温度//获取电池包电压、电流、环境温度ObtainBatteryDataService obtainBatteryDataServic…

分享一个适用于 Vue3.x 非常好用的组件库【Naive UI】

一、Naive UI 介绍 Naive UI 是一种简单易用、不太复杂的用户界面&#xff08;UI&#xff09;框架&#xff0c;主要用于Web应用程序的开发。它提供了超过80个组件&#xff0c;覆盖了表格、表单、弹窗、图表等多个方面&#xff0c;这些组件不仅功能强大&#xff0c;而且高度可定…

tomcat 设置JVM 参数

tomcat 启动的服务 设置jvm 设置的文件目录&#xff1a; /tomcat/bin/catalina.sh 添加设置参数&#xff1a; JAVA_OPTS“$JAVA_OPTS -server -Xms1024m -Xmx4096m -XX:MetaspaceSize1024m -XX:MaxMetaspaceSize2048m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/se…

C++可变参数模板类通过递归和特化方式展开

可变参数模版类有2种方式展开参数包&#xff1a;通过继承和通过递归特化。在此只举例一个后着的例子以阐述展开的方式和过程。这些内容其实书上都有&#xff0c;我只是在看《深入C11 代码优化与工程应用》一书中遇到了些困惑&#xff0c;可能书中的写法与我的理解不对版&#x…

【C++历练之路】哈希思想的应用——位图、布隆过滤器

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;我们使用hash思想学习了哈希表&#xff0c;进行了模拟实现unordered_set与unordered_map。这些都是用hash思想实现出来的数据结构&#xff0c;今天我们来学习一下hash的应用——位图、布隆过滤器。 目…

课题组里有一个卷王是什么体验?

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

Ansys ACT的一个例子

由XML和IronPython文件组成&#xff0c;文件结构如下&#xff1a; ExtSample.xml <extension version"1" name"ExtSample1"><guid shortid"ExtSample1">2cc739d5-9011-400f-ab31-a59e36e5c595</guid><script src"sam…

【全开源】废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp

介绍 一款基于FastAdminThinkPHPUniApp开发的废品回收系统&#xff0c;适用废品回收站、再生资源回收公司上门回收使用的小程序 功能特性 1、会员注册 支持小程序授权注册和手机号注册 2、回收品类 可设置回收品类&#xff0c;废纸、废金属、废玻璃、旧衣服等 3、今日指导价…

如何快速提取出一个文件里面全部指定类型的文件的全部路径

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 打开工具&#xff0c;切换到第五个模块&#xff0c;文件批量复制模块&#xff08;快捷键&#xff1a;Ctrl5&#xff09; 点击右边的“搜索添加”按钮&#…

[muduo网络库]——muduo库三大核心组件之Channel类(剖析muduo网络库核心部分、设计思想)

接着上文[muduo网络库]——muduo库的Reactor模型&#xff08;剖析muduo网络库核心部分、设计思想&#xff09;&#xff0c;接下来详细介绍一下这三大核心组件中的Channel类。 先回顾一下三大核心组件之间的关系。 接着我们进入正题。 Channel Channel类封装了一个 fd 、fd感兴…

onnx模型截取部分

这个是有需求的&#xff0c;比如有多个输入节点&#xff0c;我只用其中几个&#xff0c;或有多个输出节点&#xff0c;我只用其中几个。 比如这个输入&#xff0c;我们可以直接把transpose去掉&#xff0c;用类pytorch的N,C,H,W的格式输入。 还有如下输出&#xff1a; tran…

灵活QinQ

拓扑图 配置 sysname AR1 # interface GigabitEthernet0/0/0.10dot1q termination vid 10ip address 12.1.1.1 255.255.255.0 arp broadcast enable # interface GigabitEthernet0/0/0.20dot1q termination vid 20ip address 21.1.1.1 255.255.255.0 arp broadcast enable # …

LeetCode 题目 120:三角形最小路径和

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

Java--初识类和对象

前言 本篇讲解Java类和对象的入门版本。 学习目的&#xff1a; 1.理解什么是类和对象。 2.引入面向对象程序设计的概念 3.学会如何定义类和创建对象。 4.理解this引用。 5.了解构造方法的概念并学会使用 考虑到篇幅过长问题&#xff0c;作者决定分多次发布。 面向对象的引入 J…