浅谈 Linux fork 函数

文章目录

  • 前言
  • fork 基本概念
  • 代码演示
    • 示例1:体会 fork 函数返回值的作用
    • 示例2:创建多进程,加深对 fork 函数的理解

前言

本篇介绍 fork 函数。

fork 基本概念

pid_t fork(void)

fork 的英文含义是"分叉",在这里就是 创建子进程。返回值:失败:-1成功,两个返回值:如果当前进程是 父进程,则返回子进程的 id如果当前进程是 子进程,返回 0,返回 0 也表示创建子进程成功可以通过 fork 的返回值判断当前进程是 父进程 还是 子进程。

是的,你没有看错,fork 有两个返回值,这属实有点逆天。

那么 fork 的两个返回值有什么用呢 ?

不着急回答,我们先图解一下 fork:
在这里插入图片描述

左侧是 a 文件中的代码,在 fork 函数前有一堆代码,在 fork 函数后有两行。
在执行 fork() 后,创建了一个子进程(右图),子进程拥有和父进程一样的代码。【其实是不完全一样的,本篇是"浅谈",所以不搞复杂了】

重点来了:

  1. 子进程拥有和父进程一样的代码。
  2. 子进程会和父进程一起执行后续的代码。

如果只想让父进程执行 代码1,子进程执行 代码2,该怎么做呢?
这里 fork 的返回值就派上用场了,fork 的返回值就是用来区分父、子进程,为父、子进程指定不同的业务,具体实现会在"代码演示"中介绍。

代码演示

关于 fork 的概念没什么可说的,直接结合代码,更深入的理解 fork 吧。

示例1:体会 fork 函数返回值的作用

#include <stdio.h>
#include <unistd.h>int main() {int pid ;printf("AAA\n\n");pid = fork();if(pid > 0) {printf("开始执行父进程的代码\n");printf("I'm parent, my id %d .\n", getpid());printf("父进程的代码执行完毕.\n\n");} else if(pid == 0) {printf("开始执行子进程的代码\n");printf("I'm child. my id: %d\n", getpid());printf("子进程的代码执行完毕.\n\n");}printf("BBB.\n");
}

在这里插入图片描述

【非常重要】我们分析以上的输出结果:
① 两个分支都执行了,这证明 fork 返回了两个值,父、子进程会各自进入条件逻辑中执行自己的代码
② “BBB” 被输出了两次,这说明 父、子进程都会执行 fork 函数后面的代码,只有在遇到条件逻辑时,父子进程 才会执行各自的代码。
③ 通过 fork 的返回值,可以区分 父、子进程,从而为 父、子进程 分配不同的业务逻辑。
④ fork 之后 父进程 和 子进程 的执行顺序不确定,这取决于内核所使用的调度算法。【这点没体现出来,但是得知道】

到此,fork 的返回值就解释完了。

我们最后再通过创建多进程来加深对 fork 函数的理解。

示例2:创建多进程,加深对 fork 函数的理解

我们知道,创建进程使用的是 fork 函数,那么创建多进程自然就是循环调用 fork 函数了。

最容易想到的是下面这样:

    for(i=0; i<5; i++) {// 创建 5 个进程pid = fork();if(pid > 0){printf("我是第 %d 个 子进程.\n", i);}}

你仔细想想,这对吗?
我们运行一下:
在这里插入图片描述

原因就是上面提到过的第 ② 句: " 父、子进程都会执行 fork 函数后面的代码,只有在遇到条件逻辑时,父子进程 才会执行各自的代码 "。

也就是说父进程在创建出子进程后,子进程也会继续执行 for 里面的语句,这就会导致子进程继续创建 子子进程,子子进程 也会继续执行 for 里面的语句,然后以此类推,子子进程,再创建 子子子进程 …

要解决这个问题,就是创建出子进程后,让子进程执行完逻辑后就马上退出 for 循环,不要继续创建 子子进程。

正确逻辑如下:

#include <stdio.h>
#include <unistd.h>int main() {int pid, i;for(i=0; i<5; i++) {// 创建 5 个进程pid = fork();if(pid == 0){printf("我是第 %d 个 子进程, pid: %d\n", i, getpid());break;  // 直接让子进程跳出循环}sleep(1);  // 让进程的输出变得有序}return 0;
}

在这里插入图片描述

题外话:
因为当前示例只是为了演示多进程的创建,加深对 fork 函数的理解,所以采用了 break 的方式假装结束子进程的运行,实际上子进程只是跳出 for 循环,子进程还是会继续运行 for 之外后续的语句,但是 for 之外没有后续语句了,子进程就执行完毕,所以这看起来是 break 后子进程就结束了。

实际上结束进程应采用特定的函数,由于本篇只是 “浅谈”,让读者专注于最核心的部分,所以就不扯多了。

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

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

相关文章

UE4c++ ConvertActorsToStaticMesh

UE4c ConvertActorsToStaticMesh ConvertActorsToStaticMesh UE4c ConvertActorsToStaticMesh创建Edior模块&#xff08;最好是放Editor模块毕竟是编辑器代码&#xff09;创建UBlueprintFunctionLibraryUTestFunctionLibrary.hUTestFunctionLibrary.cpp:.Build.cs 目标:为了大量…

oracle 如何使用脚本实现访问控制(无需额外插件)

随着这些年勒索病毒的爆发,各个企业对数据安全的要求越来越高,常见的办法有开启数据库审计,加数据库防火墙,网络限制等等;但是细粒度审计会消耗大量系统资源,第三方数据库防火墙一般是需要收费的;这里介绍我个人常用的四个db级别trigger,用于记录部分关键信息可以应对部…

【QT+QGIS跨平台编译】之五十一:【QGIS_CORE跨平台编译】—【qgsexpressionparser.cpp生成】

文章目录 一、Bison二、生成来源三、构建过程一、Bison GNU Bison 是一个通用的解析器生成器,它可以将注释的无上下文语法转换为使用 LALR (1) 解析表的确定性 LR 或广义 LR (GLR) 解析器。Bison 还可以生成 IELR (1) 或规范 LR (1) 解析表。一旦您熟练使用 Bison,您可以使用…

通过redfish协议实现服务器固件升级、从虚拟光驱启动自检盘并等待完成,最后截图保存

通过redfish协议实现服务器固件升级、从虚拟光驱启动自检盘并等待完成,最后截图保存 版本信息代码 新开发的PCIE设备在做服务器适配时,有时需要服务器厂家更新BMC或BIOS固件。同时,我们也希望对PCIE设备做一些检测,最后收集一些信息存档。如果需要处理的服务器很多,通过BMC的界…

【严格递增】2972统计移除递增子数组的数目 II

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 严格递增 子数组 LeetCode2972. 统计移除递增子数组的数目 II 给你一个下标从 0 开始的 正 整数数组 nums 。 如果 nums 的一个子数组满足&#xff1a;移除这个子数组后剩余元素 严格递增 &#xff0c;那么我们称这个子…

Vue+SpringBoot打造天然气工程业务管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…

Qt RGB三色灯上位机

今天突发奇想做一个Qt RGB三色灯上位机&#xff0c;刚好手上有一个RGB三色灯和arduion开发板。 我是想实现一个颜色选择器界面然后鼠标点击颜色区域就可以发出rgb的值&#xff0c;然后把这个值通过串口线发送给arduion,arduion再解析出数据发送给RGB三色灯。 实现界面如下&…

express+mysql+vue,从零搭建一个商城管理系统3--user路由模块

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、新建routes文件夹二、新建routes/index.js和routes/user.js三、修改index.js四、修改routes/index.js五、修改routes/user.js六、启动项目预览总结 前言 需求&#xff1a;主要学习express&#xff0c;所…

maven的私服

什么是maven的私服就是把自己写的工具类共享给别人这样大家都能用到你写的工具类不用重复写提示效率 maven的上传与下载示意图 1.什么是发行版本&#xff1f;发行版本指定的是功能稳定可以共大家使用的版本 2.什么是快照版本&#xff1f;快照版本指定的是指正在开发的版本 3…

java解决统计有序矩阵中的负数

java解决统计有序矩阵中的负数 01 题目 给你一个 m * n 的矩阵 grid&#xff0c;矩阵中的元素无论是按行还是按列&#xff0c;都以非严格递减顺序排列。 请你统计并返回 grid 中 负数 的数目。 示例 1&#xff1a; 输入&#xff1a;grid [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],…

[java] 23种设计模式之适配器模式

适配器模式将某个类的接口转换成客户端期望的另一个接口表示&#xff0c;目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类&#xff1a;类的适配器模式、对象的适配器模式、接口的适配器模式。首先&#xff0c;我们来看看类的适配器模式 1.1 类的适配器模式 核…

LeetCode刷题笔记之回溯算法(二)

一、排列问题 排列是有序的&#xff0c;即{1&#xff0c;2}与{2&#xff0c;1}是两个排序。 1. 46【全排列】 题目&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其所有可能的全排列。你可以按任意顺序返回答案。代码&#xff1a; class Solution {List<…

ChatGPT 正测试Android屏幕小组件;联想ThinkBook 推出透明笔记本电脑

▶ ChatGPT 测试屏幕小组件 近日 ChatGPT 正在测试 Android 平台上的屏幕小组件&#xff0c;类似于手机中的悬浮窗&#xff0c;按住 Android 手机主屏幕上的空白位置就可以调出 ChatGPT 的部件菜单。 菜单中提供了许多选项&#xff0c;包括文本、语音和视频查询的快捷方式&…

第102讲:MySQL多实例与Mycat分布式读写分离的架构实践

文章目录 1.Mycat读写分离分布式架构规划2.在两台服务器中搭建八个MySQL实例2.1.安装MySQL软件2.2.创建每个MySQL实例的数据目录并初始化2.3.准备每个实例的配置文件2.4.准备每个实例的启动脚本2.6启动每台机器的MySQL多实例2.7.为每个MySQL实例设置密码2.8.查看每个MySQL实例的…

蓝桥杯第十四届电子类单片机组决赛程序设计

目录 前言 单片机资源数据包_2023&#xff08;点击下载&#xff09; 一、第十四届比赛题目 1.比赛题目 2.题目解读 1&#xff09;任务要求 2&#xff09;注意事项 二、显示功能实现 1.关于高位为0时数码管熄灭功能的实现 2.关于显示小数位的处理 3.关于“校准值”的…

Nginx反向代理ip透传与负载均衡

前言 上篇介绍了nginx服务器单向代理和动静分离等相关内容&#xff0c;可参考Nginx重写功能和反向代理-CSDN博客&#xff0c;这里就ip透传和负载均衡对nginx反向代理做进一步了解。 目录 一、客户端ip透传 1. 概述 2. 一级代理 2.1 图示 2.2 操作过程 3. 二级代理 3.…

使用ffmpeg压缩视频

一、到ffmpeg官网下载文件包&#xff1a; Download FFmpeg 下载后找到 bin 下的3个exe文件&#xff0c;复制到自己本机的某个目录下, 如&#xff1a; 二、使用命令行压缩&#xff1a; ffmpeg -i input.mp4 -c:v libx265 -crf 28 -y output.mp4 这条命令使用 FFmpeg 工具对输…

机器学习——线性代数中矩阵和向量的基本介绍

矩阵和向量的基本概念 矩阵的基本概念&#xff08;这里不多说&#xff0c;应该都知道&#xff09; 而向量就是一个特殊的矩阵&#xff0c;即向量只有一列&#xff0c;是个n*1的矩阵 注&#xff1a;一般矩阵用大写字母表示&#xff0c;向量用小写字母表示 矩阵的加减运算 两个…

大语言模型LLM推理加速主流框架(LLM系列10)

文章目录 大语言模型LLM推理加速主流框架&#xff08;LLM系列10&#xff09;引言大语言模型推理基础LLM推理加速的主要途径模型优化技术硬件加速软件层面优化 主流LLM推理框架集成概述TensorRT-LLMPyTorch/TensorFlow Serving其他框架与工具 实例分析与应用案例** 大语言模型LL…

大语言模型LLM推理加速:LangChain与ChatGLM3-6B的推理加速技术(LLM系列11)

文章目录 大语言模型LLM推理加速&#xff1a;LangChain与ChatGLM3-6B的推理加速技术&#xff08;LLM系列11&#xff09;引言LangChain框架下的推理优化LangChain的核心理念与功能特点分布式计算与知识图谱集成优化推理路径实例分析&#xff1a;使用链式查询与缓存机制提升模型推…