Linux运用fork函数创建进程
fork函数:
函数原型:
pid_t fork(void);
父进程调用fork函数创建一个子进程,子进程的用户区父进程的用户区完全一样,但是内核区不完全一样;如父进程的PID和子进程的PID不一样。
返回值:
RETURN VALUEOn success, the PID of the child process is returned in the parent, and0 is returned in the child. On failure, -1 is returned in the parent,no child process is created, and errno is set appropriately.
父进程返回的是子进程的PID,这个值大于0。
子进程返回的是0。
注意:一个进程只能返回一个值,父子进程各自返回一个值。
父进程执行pid>0的逻辑,子进程执行pid==0的逻辑;
父子进程谁先执行:谁先抢到cpu时间片,谁先执行。
这是fork.c文件:

通过fork函数创建了一个子进程。
pid也获得了两个值,一个大于零(父进程),一个等于零(子进程)。
两个进程都会执行下面的语句。
父进程执行时,pid>0,会打印出"father:pid==[%d]\n"
子进程执行时,pid=0,会打印出"child:pid==[%d]\n"
在父进程处加sleep(1)是防止父进程比子进程提前结束,让子进程变成孤儿进程。
执行后:

去掉sleep后有两种结果,一种是子进程先结束:

一种是父进程先结束,子进程变孤儿进程,返回命令句:

如何创建兄弟进程 :

通过以上操作创建的子进程不是全部是兄弟进程,就创建出七个子进程(子进程也会创建子进程)。我们可以添加break;如果是子进程,就跳出循环,不让他创建自己的子进程。

再添加以下操作就可以知道是第几个进程

父进程中i会增到3,所以i==3时是父进程。
完整代码:
#include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 #include<sys/types.h>5 #include<unistd.h>6 int main()7 {8 9 //pid_t fork(void);10 int i=0;11 for(;i<3;i++)12 {13 pid_t pid=fork();14 if(pid<0)15 {16 perror("fork error");17 return -1;18 }19 else if(pid>0)20 {21 printf("father:pid==[%d],fpid==[%d]\n",getpid(),getppid());22 //sleep(1);23 }24 else if(pid==0)25 {26 printf("child:pid==[%d],fpid==[%d]\n",getpid(),getppid());break;27 }28 // else if(pid>0)29 // {30 // printf("father:pid==[%d]\n",getpid());31 // }32 }33 if(i==0)34 {35 printf("[%d]----[%d]:child\n",i,getpid());36 }37 if(i==1)38 {39 printf("[%d]----[%d]:child\n",i,getpid());40 }41 if(i==2)42 {43 printf("[%d]----[%d]:child\n",i,getpid());44 }45 if(i==3)46 {47 printf("[%d]----[%d]:father\n",i,getpid());48 }49 return 0;50 }
结果:

父子进程不能共享全局变量:
但是父子进程只是对全局变量做读操作,则父子进程在内存中只有一份,属于共享。
但是父子进程中任何一个进程对该全局变量做修改操作,会在内存中拷贝一个副本,然后在这个副本上进行修改,修改完成以后映射回去。--写时复制(拷贝),读时共享
验证:

在pid==0(子进程)时加上sleep(1),是为了避免父进程还没有执行,子进程就已经结束。
结果:

结果发现子进程中val==9,由此当父进程修改val的值时,父子进程不再共享全局变量。
相关文章:
Linux运用fork函数创建进程
fork函数: 函数原型: pid_t fork(void); 父进程调用fork函数创建一个子进程,子进程的用户区父进程的用户区完全一样,但是内核区不完全一样;如父进程的PID和子进程的PID不一样。 返回值: RETURN VALUEO…...
Pytest测试技巧之Fixture:模块化管理测试数据
在 Pytest 测试中,有效管理测试数据是提高测试质量和可维护性的关键。本文将深入探讨 Pytest 中的 Fixture,特别是如何利用 Fixture 实现测试数据的模块化管理,以提高测试用例的清晰度和可复用性。 什么是Fixture? 在 Pytest 中&a…...
设计模式-职责链模式Chain of Responsibility
职责链模式 一、原理和实现二、实现方式1) 使用链表实现2) 使用数组实现3) 扩展 作用:复用和扩展,在实际的项目开发中比较常用。在框架开发中,我们也可以利用它们来提供框架的扩展点,能够让框架的使用者在不修改框架源码的情况下&…...
书生浦语大模型实战营-课程作业(3)
下载sentence_transformer的代码运行情况。sentence_transformer用于embedding(转向量) 本地构建持久化向量数据库。就是把txt和md文件抽取出纯文本,分割成定长(500)后转换成向量,保存到本地,称…...
考研英语单词25
Day 25 bench n.长凳 elastic n.橡皮圈,松紧带 a.灵活的 “e-last 延伸出去” disaster n.灾难,灾祸【disastrous a.灾难性的,极坏的】 deadly a.致命的,极端的,势不两立的 hike n.徒步旅行&…...
计算机网络——08应用层原理
应用层原理 创建一个新的网络 编程 在不同的端系统上运行通过网络基础设施提供的服务,应用进程批次通信如Web Web服务器软件与浏览器软件通信 网络核心中没有应用层软件 网络核心没有应用层功能网络应用只能在端系统上存在 快速网络应用开发和部署 网络应用…...
面试计算机网络框架八股文十问十答第五期
面试计算机网络框架八股文十问十答第五期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)与缓存相关的HTTP请…...
拟合案例1:matlab积分函数拟合详细步骤及源码
本文介绍一下基于matlab实现积分函数拟合的过程。采用的工具是lsqcurvefit和nlinfit两个函数工具。关于包含积分运算的函数,这里可以分为两大类啊。我们用具体的案例来展示:一种是积分运算中不包含这个自变量,如下图的第一个公式,也就是说它这个积分运算只有R和Q这两个待定…...
嵌入式软件设计入门:从零开始学习嵌入式软件设计
(本文为简单介绍,个人观点仅供参考) 首先,让我们了解一下嵌入式软件的定义。嵌入式软件是指运行在嵌入式系统中的特定用途软件,它通常被用来控制硬件设备、处理实时数据和实现特定功能。与桌面应用程序相比,嵌入式软件需要具备更高的实时性、…...
Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)
文章目录 题目链接题意题解代码 题目链接 C. Digital Logarithm 题意 给两个长度位 n n n的数组 a a a、 b b b,一个操作 f f f 定义操作 f f f为, a [ i ] f ( a [ i ] ) a [ i ] a[i]f(a[i])a[i] a[i]f(a[i])a[i]的位数 求最少多少次操作可以使 …...
微信小程序介绍、账号申请、开发者工具目录结构详解及小程序配置
目录 一、微信小程序介绍 1.什么是小程序? 2.小程序可以干什么? 3.微信小程序特点 二、账号申请 1.账号注册 2.测试号申请 三、安装开发工具 四、开发小程序 五、目录结构 JSON 配置 小程序配置 app.json 工具配置 project.config.json 页…...
数字的魅力之情有独钟的素数
情有独钟的素数 什么是素数 素数(Prime number)也称为质数,是指在非0自然数中,除了1与其本身之外不拥有其他因数的自然数。也就是说,素数需要满足两个条件: 大于1的整数;只拥有1和其自身两个…...
Vue2源码梳理:render函数的实现
render 在 $mount 时,会调用 render 方法在写 template 时,最终也会转换成 render 方法Vue 的 _render 方法是实例的一个私有方法,它用来把实例渲染成一个虚拟 Node它的定义在 src/core/instance/render.js 文件中,它返回的是一个…...
flask+python企业产品订单管理系统938re
在设计中采用“自下而上”的思想,在创新型产品提前购模块实现了个人中心、个体管理、发布企业管理、投资企业管理、项目分类管理、产品项目管理、个体投资管理、企业投资管理、个体订单管理、企业订单管理、系统管理等的功能性进行操作。最终,对基本系统…...
Vue2源码梳理:关于数据驱动,与new Vue时的初始化操作
数据驱动 1 )概述 vue的一个核心思想,就是数据驱动 所谓数据驱动,就是指视图是由数据驱动生成的 对视图的修改并不会直接操作dom,而是通过修改数据 它相比我们传统的前端开发,如使用 jQuery 的前端库直接去修改 dom…...
【C++航海王:追寻罗杰的编程之路】关于模板,你知道哪些?
目录 1 -> 泛型编程 2 -> 函数模板 2.1 -> 函数模板概念 2.2 -> 函数模板格式 2.3 -> 函数模板的原理 2.4 -> 函数模板的实例化 2.5 -> 函数参数的匹配原则 3 -> 类模板 3.1 -> 类模板的定义格式 3.2 -> 类模板的实例化 1 -> 泛型编…...
分布式springboot 3项目集成mybatis官方生成器开发记录
文章目录 说明实现思路实现步骤第一步:创建generator子模块第二步:引入相关maven插件和依赖第三步:编写生成器配置文件第四步:运行查看结果 说明 该文章为作者开发学习记录,方便以后复习和交流主要内容为:…...
算法学习——LeetCode力扣回溯篇4
算法学习——LeetCode力扣回溯篇4 332. 重新安排行程 332. 重新安排行程 - 力扣(LeetCode) 描述 给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票…...
c++ STL系列——(六)multimap
C标准模板库(STL)是C编程中不可或缺的一部分,它提供了一系列的容器、算法和函数模板,以简化常见的数据结构和算法的实现。在STL中,multimap是一个非常有用的容器,它提供了一种键值对的存储方式,…...
Json-序列化字符串时间格式问题
序列化字符串时间格式问题 一、项目场景二、问题描述三、解决方案 一、项目场景 最近C#中需要将实体进行json序列化,使用了Newtonsoft.Json public static void TestJson(){DataTable dt new DataTable();dt.Columns.Add("Age", Type.GetType("Sys…...
告别BiSeNet的臃肿:手把手教你用STDC网络在MMSegmentation中实现更快的实时语义分割
从BiSeNet到STDC:在MMSegmentation中构建高效实时语义分割模型的实战指南 当你在深夜调试一个需要实时反馈的无人机视觉系统时,BiSeNet的多路径结构是否正在消耗你宝贵的计算资源?STDC网络的出现,为这类场景带来了新的可能性。本文…...
GD32C103RBT6 I2C 驱动全解析
一、I2C 通信基础概述 1. I2C 硬件接口 GD32C10x 提供 I2C0、I2C1 两组硬件 I2C: SCL:串行时钟线(由主机产生) SDA:串行数据线 需外接 上拉电阻(4.7kΩ 经典值) 支持 多主机、多从机 2. 通信模式 主机模式:MCU 主动发起通信(最常用) 从机模式:MCU 被其他主机访问 …...
构建多模型备援策略以提升企业级 AI 应用可靠性
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 构建多模型备援策略以提升企业级 AI 应用可靠性 在构建企业级 AI 应用时,服务的稳定性与可靠性是核心考量之一。单一模…...
KNN和K-Means选错距离度量?详解闵可夫斯基距离中参数p的实战调优
KNN与K-Means距离度量实战:如何用闵可夫斯基距离参数p提升模型性能 当你在scikit-learn中第一次使用KNN分类器时,可能会注意到一个不起眼的参数p——它默认为2,代表使用欧氏距离。但鲜有人告诉你,这个参数的选择可能让你的模型准确…...
构建高效电商后台管理系统:SpringBoot 项目推荐
构建高效电商后台管理系统:SpringBoot 项目推荐 【下载地址】SpringBoot电商后台管理系统项目介绍 本项目基于SpringBoot框架实现,提供了一套完整的电商后台管理系统解决方案。系统专注于用户管理和权限管理两大核心功能模块,旨在帮助开发者快…...
从数学常数到编程实战:用C++三种方法手把手教你计算自然常数e(附OpenJudge NOI 1.5 35题解)
从数学常数到编程实战:用C三种方法手把手教你计算自然常数e 自然常数e是数学中最重要的常数之一,广泛应用于微积分、概率统计和复利计算等领域。对于编程学习者来说,理解e的计算原理并实现其算法,不仅能加深对数学概念的理解&…...
RPG Maker Decrypter:如何5步解密RPG Maker加密资源并生成可编辑项目
RPG Maker Decrypter:如何5步解密RPG Maker加密资源并生成可编辑项目 【免费下载链接】RPGMakerDecrypter Tool for decrypting and extracting RPG Maker XP, VX and VX Ace encrypted archives and MV and MZ encrypted files. 项目地址: https://gitcode.com/g…...
AM62A1-Q1汽车视觉处理器:低功耗、高集成度的车载视觉解决方案
1. 项目概述:为什么我们需要一颗“小而美”的汽车视觉处理器?最近在做一个车载环视和DMS(驾驶员监控系统)的预研项目,客户对成本和功耗卡得非常死,但功能要求却一点没降:需要同时处理1到2路摄像…...
昇腾310开发板内存告急?手把手教你在Ubuntu虚拟机上离线转换YOLOv5模型(非root用户避坑指南)
昇腾310开发板内存告急?Ubuntu虚拟机离线转换YOLOv5模型全攻略 当开发者手头只有一块内存有限的昇腾310开发板时,模型转换工作往往会遇到硬件资源不足的困境。本文将详细介绍如何在普通x86架构的Ubuntu虚拟机上,完成YOLOv5模型的离线转换全流…...
MPC-BE:Windows平台终极开源多媒体播放器架构深度解析与实战指南
MPC-BE:Windows平台终极开源多媒体播放器架构深度解析与实战指南 【免费下载链接】MPC-BE MPC-BE – универсальный проигрыватель аудио и видеофайлов для операционной системы Windows. 项…...
