【Linux】如何创建进程?

news2024/11/24 23:08:10

       🔥🔥 欢迎来到小林的博客!!
      🛰️博客主页:✈️林 子
      🛰️博客专栏:✈️ 小林的Linux之路
      🛰️社区 :✈️ 进步学堂
      🛰️欢迎关注:👍点赞🙌收藏✍️留言

文章目录

  • fork函数是什么?
  • fork创建进程
  • 两个返回值
      • 子进程的数据来源
      • 子进程结构体来源
      • 为什么会有2个返回值?
  • 总结

fork函数是什么?

fork函数是一个系统调用接口,我们可以通过man 2 fork 查看它。

在这里插入图片描述
而这个函数的作用就是创建一个子进程。接下来我们好好探索进程的创建。

fork创建进程

fork是一个创建子进程的函数。我们写一个程序来演示一下。

在这里插入图片描述

然后我们编译运行。

我们会发现,打印了2次hello world。

在这里插入图片描述

为什么会打印2次helloworld?因为fork函数它又新建了一个新的进程。这个新的继承继承了它的父进程。而fork的返回值。如果是子继承返回,会返回0。如果是父进程返回,会返回子进程的pid。如果进程创建失败,返回-1。

所以我们改造一下我们的程序。

在这里插入图片描述

这个程序就把子进程和父进程分流了。如果是子进程,则输出 child process pis is 子进程的pid。如果是父进程则输出父进程的pid。为了方便观察,每次执行完睡眠一秒

我们编译执行

在这里插入图片描述

我们会发现,父进程的pid是10967,子进程的pid是10968。我们可以来查看一下进程,输入命令: ps ajx | head -1 && ps ajx | grep "myprocess"查看

在这里插入图片描述

我们发现,我们查看的时候会出现多列数据。第一列代表管理进程的pid,就是管理当前进程的进程的pid。第二列是当前进程的pid,第三列是父进程的pid。

那么我们kill -9 10968,杀掉子进程看看。

我们杀掉子进程后,就只有父进程再运行了,所以只输出father process。

在这里插入图片描述

这也可以说明,这个程序是有2个进程再执行的。那么这时候就有疑问了。

两个返回值

这时候我们就有疑问了,为什么fork函数有2个返回值?明明只调用了一次,而2个pid的值却互不相同。

要搞清楚这个问题,我们要先弄清楚,fork创建一个新进程。这个新进程的数据是从哪来的?

再上篇进程概念我提到过,**进程 = 描述进程的结构体 + 数据代码 ** 。那么fork创建进程的时候,这个新进程的内容,是怎么来的呢?

子进程的数据来源

子进程的数据来源

我们上面打印了2次hello word。就证明了,子进程和父进程的数据和代码是共享的。前提是进程的数据在后续不会发生修改!如果发生修改,那么父进程的数据会发生一次实时拷贝,随后把拷贝的代码数据交给子进程!

所以: 当进程里数据没有发生修改时。那么子进程和父进程共享代码和数据!如果有一个进程的数据发送了修改,那么会对数据发送写实拷贝,而代码依旧是共享的

在这里插入图片描述

如果发生修改,那么父进程的代码数据会进行一份实时拷贝,给子进程。

在这里插入图片描述

子进程结构体来源

子进程结构体来源

那么fork创建的子进程,描述它的结构体是怎么来的呢?

是根据父进程结构体模板初始化来的。

如何理解这句话,打个比方。你爸爸生出了你,那你的数据怎么来的?假如你爸爸姓王,那么你肯定也姓王。所以你的数据是根据你爸爸的模板来起的。所以这里的子进程也是一样的,它的结构体数据是根据它的父进程初始化的。但肯定也不是一模一样,pid,ppid…肯定都是子进程独有的。

为什么会有2个返回值?

现在我们再回到之前的问题,为什么fork会返回两个值?我们不不妨这样子想,当一个函数执行到return的时候。那么它的功能是不是都已经执行完了?功能都执行完了,就意味着子进程在fork函数return之前就已经创建好了,既然子进程已经创建好了,那么就会继承父进程的代码和数据。那么父进程的程序计数器也会被继承下来,这就意味着子进程也有一个fork函数,并且能返回一个值回去。

所以子进程也会发生return操作。而我们的一个父进程是可以有多个子进程的,那么父进程就要通过子进程的pid来找到子进程,所以fork函数会给父进程返回子进程的pid。而子进程一定只有一个父进程,可以直接通过ppid找到父进程,所以并不需要返回父进程的pid,所以fork函数会给子进程返回0。

父进程给子进程的返回值是0,子进程给父进程返回其pid值(大于0),创建失败返回-1(小于0)。

所以,接收fork返回值的变量也是数据,但fork给子进程和父进程返回的值均不相同,所以这里也会发生一次写实拷贝。

0,子进程给父进程返回其pid值(大于0),创建失败返回-1(小于0)。

所以,接收fork返回值的变量也是数据,但fork给子进程和父进程返回的值均不相同,所以这里也会发生一次写实拷贝。

总结

1.子进程是由父进程的模板创建的
2.子进程和父进程一般情况下共享代码和数据,但如果有一方的数据或代码被修改,那么操作系统会写实拷贝一份。
3.fork函数不是真的有2个返回值,而是两个进程都在fork函数执行了返回操作。
4.fork返回父进程子进程的PID,给子进程返回0,进程创建失败返回-1

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

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

相关文章

【技术】《Netty》从零开始学netty源码(四十八)之缓存池ObjectPool

目录 ObjectPool创建对象池获取对象get()从本地池中获取对象claim()回收对象 ObjectPool 在分析PooledByteBuf的时候我们遇到了recycleHandler类,该类用于回收已经使用完毕的缓存对象并将其放回池中供下次循环利用,Netty的对象池工作过程大体如下&#…

数字图像处理简答题

目录 1.人类视觉对颜色的主观感觉包括哪三类? 2. 图像成像的过程包括哪三步? 3.图像的采样和量化分别指什么? 4、取k8时,将下图用相应矩阵表示 5、简述当限定了数字图像的数据量时采样和量化参数的选择遵循哪两条原则&#x…

荔枝派Zero(全志V3S)制作 IMG 镜像文件

文章目录 前言一、安装工具二、生成新的 img 文件三、分割虚拟磁盘四、挂载虚拟磁盘并格式化1、首先建立虚拟磁盘并分区2、格式化虚拟磁盘分区 五、开始备份六、卸载虚拟磁盘七、dd 烧录系统八、运行测试 前言 之前在玩板子时每次烧录镜像都是先烧录 uboot 到 SD 卡 8k 偏移处…

03 DQL-表数据的查询

1.数据准备(直接复制执行即可) -- 创建db1数据库 CREATE DATABASE db1;-- 使用db1数据库 USE db1;-- 创建数据表 CREATE TABLE product(id INT, -- 商品编号NAME VARCHAR(20), -- 商品名称price DOUBLE, -- 商品价格brand VARCHAR(10), -- 商品品牌stock INT, -- 商品库存…

【场景削减】基于 Kantorovich 距离的 SBR 算法场景削减研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

SpringCloud:微服务保护之雪崩问题及解决方案

1.雪崩问题 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。 如图,如果服务提供者I发生了故障,当前的应用的部分业务因为依赖于服务I,因此也会被阻塞。此时,其它不依赖于服务I的业…

Redis学习笔记01 (数据结构,线程模型,持久化)

Background Redis(Remote Dictionary Server)是一种基于键值对的内存数据库,通常被称为数据结构服务器。它支持多种数据结构,例如字符串(String)、哈希(Hash)、列表(Li…

17 图的遍历和应用

文章目录 图的遍历深度优先遍历对于无向图的邻接矩阵的深度优先遍历无向非连通图的深度优先遍历 对于无向图的邻接表的深度优先遍历非递归实现深度优先遍历无向图的邻接矩阵代码实现无向图的邻接表代码实现递归和非递归的同异 广度优先遍历邻接表BFS邻接矩阵BFS 图的应用生成树…

计算机组成原理指令系统习题

(1)解析:考察指令的格式:指令码包含地址码和操作码 寻址特征位包含在操作码中 用于区分不同的寻址方式。 首先确定6种寻址方式 根据2^3>6得出三位寻址地址位,再根据能完成97种操作,所以OP的位数是7位(128&#xff0…

【论文代码阅读】LORA: LOW-RANK ADAPTATION OF LARGE LAN- GUAGE MODELS

最近很多工作好像都绕不开lora,无论是sd还是llm.... 1. 背景 问题:大模型重新训练所有模型参数的完全微调变得不太可行。lora在做什么 我们提出了低秩自适应,即LoRA,它冻结预先训练的模型权重,并将可训练的秩分解矩…

【数字图像处理简答题】

目录 1.邻域和邻接有何区别? 2. m邻接的定义是什么?为何要引入m邻接? 3、下图的连通域个数?分别是什么(使用8连通) 4、像素间的距离测度有哪四种,写出其表达式并绘制几何示意图。 5、图像间…

算法套路十三——动态规划DP入门

算法套路十三——动态规划DP入门 动态规划和递归都是通过将大问题分解为较小的子问题来解决问题。它们都可以用来解决具有重叠子问题和最优子结构特性的问题。在很多情况下,动态规划算法的设计可以从递归算法开始,然后通过添加记忆化(Memoiz…

什么是SpringBoot自动配置

概述: 现在的Java面试基本都会问到你知道什么是Springboot的自动配置。为什么面试官要问这样的问题,主要是在于看你有没有对Springboot的原理有没有深入的了解,有没有看过Springboot的源码,这是区别普通程序员与高级程序员最好的…

【五一创作】网络协议与攻击模拟-01-wireshark使用-捕获过滤器

协议 TCP/IP协议簇 网络接口层(没有特定的协议)PPPOE 物理层 数据链路层 网络层:IP (v4/v6) ARP (地址解析协议) RARP ICMP (Internet控制报文协议) IGMP 传输层:TCP(传输控制协议) UDP(用户数据报协议) 应用层:都是基于传输层协议的端口,总共端口0~65535 0~1023 HTTP—t…

2023年第十五届华中杯数学建模赛题浅析

2023年五一假期期间,数学建模竞赛就有四场,各种比赛各种需求应接不暇。因此,对于本次浅析有不足的地方欢迎大家指出。为了更好的帮助大家华中杯选题,首先为大家带来ABC三个题目的浅析,帮助大家更快的选题,提…

DBeaver 没有菜单项 生成SQL Generate SQL

文章目录 Intro问题的根本有无该菜单项取决于你的查询SQL是单表还是多表?单表查询的结果集的菜单多表关联查询的结果集的菜单 测试版本 Intro DBeaver 是一款很棒的多平台、支持多数据源的GUI数据库客户端。 有一个我经常使用的功能就是: 当我查询到一个…

BUUCTF bjdctf_2020_babystack

小白做题笔记而已,不建议阅读 只有一个NX 64为程序用rdi传参 read函数存在栈溢出 shift f12 有system函数调用,并且存在/bin/sh 去找有没有pop rdi ret ROPgadget --binary bjdctf_2020_babystack --only "pop|ret" | grep rdi 0…

『Linux』第九讲:Linux多线程详解(二)_ 线程控制

「前言」文章是关于Linux多线程方面的知识,上一篇是 Linux多线程详解(一),今天这篇是 Linux多线程详解(二),讲解会比较细,下面开始! 「归属专栏」Linux系统编程 「笔者」…

「OceanBase 4.1 体验」|连续多年支撑双11的国产原生分布式数据库

目录 前言 正文 1. OceanBase 4.1发布 2.部署oceanbase 安装环境 2.1下载 all-in-one 安装包 2.2解压安装包 2.3执行安装脚本 2.4设置环境变量 2.5查看文件位置 2.6快速启动demo环境 2.7访问数据库 3.oceanbase的优点 4.oceanbase与 Oracle 兼容性 5.oceanbase与…

王学岗码牛jetpack系列之ViewModel

ViewModel的目的:存储数据,以注重生命周期的方式管理界面的相关数据 viewModel的特性:1,数据持久化,不依赖于Activity的生命周期,有自己独立的生命周期 2,异步回调不会造成内存泄漏 3,隔离Model层与View层 4&#xff0…