进程通信(管道,共享内存实现)
01. 进程通信简介
进程通信工具分为数据传输工具和共享内存两类。这里我们讨论进程通信工具(IPC
)里面的管道、system V
和共享内存。在理解阶层通信之间,我们先了解用户空间缓冲区和内核空间缓冲区两个概念。
1.1 用户空间缓冲区
存在于用户态的进程用户空间,进程直接读取。用于存储待发送或已接收的数据,减少频繁的系统调用开销。
代码示例:
char buf[1024];
write(fd, buf, sizeof(buf)); // 将用户缓冲区buf数据写到fd指向内核
read(fd, buf, sizeof(buf)); // 从内核读取数据到用户缓冲区
**PS:**可以使用 fnprintf
先写入用户缓冲区,满后再通过 write
系统调用写入内核(后面有提到)。
1.2 内核空间缓冲区
存在于内核态作为管道通信的中转站,操作系统进行管理,使用系统调用访问
02. 管道(pipe)
我们再使用Linux
的ls | wc -l
命令时,会用到 |
这个符号表示的即是一个管道。为了执行这么命令创建了两个进程分别执行ls
和 wc
。
2.1 管道特点
为了通信,一个进程从用户内存向内核内存(进程通信)工具中写入数据,另外一个进程从内核内存读取数据到用户内存,这样便完成了数据的写入和读取,两个过程不能同时进行,且有以下要求:
- 血缘关系:仅适用于有共同祖先(血缘关系)的进程;通常,一个管道由一个进程创建,然后该进程调用
fork()
,此后父、子进程之间就可应用该管道(下方有涉及) - 内核缓冲区:数据通过内核缓冲区传输,默认大小通常为
4KB
- 阻塞机制:当管道为空时,读操作阻塞;当管道满时,写操作阻塞;进程退出,管道释放
- 半双工:数据只能单向流动若需双向通信,需创建两个管道
2.2管道的创建和使用
int pipe(int pipefds[2])//成功返回0,失败返回-1并且errno报错
pipe()
系统调用创建一个新管道。成功的pipe()
调用会在pipefds数组
中返回两个打开的文件描述符:pipefds[0]
表示读取端,pipefds[1]
表示写入端。可以使用 read()和 write()系统调用来在管道上执行 I/O。一旦向管道写入数据之后立即就能从管道的读取端读取数据。但当管道为空时阻塞read()调用读取的是min
{请求的字节数,当前管道存在字节数}。
2.2.1 匿名管道
父子进程通信过程:
-
父进程创建管道,得到两个⽂件描述符指向管道的两端
-
父进程fork出子进程,⼦进程也有两个⽂件描述符指向同⼀管道
-
子进程关闭
pipefds[0]
读端,父进程关闭pipefds[1]
写端即可实现了进程间通信
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{int pipefds[2] = {0};int n = pipe(pipefds);assert(n == 0)// 0:读取端 1:写入端pid_t id = fork();assert(id >= 0) ;if (id == 0){ // 子进程写入close(pipefds[0]); // 子进程关闭读端const char *msg = "hello Linux!";int cnt = 0;while (1){char buf[1024];fnprintf(buf, sizeof buf, "child is sauing:%s[%d] ", msg, cnt);write(pipefds[1], buf, strlen(buf));sleep(1);}exit(0);}// 父进程读取close(pipefds[1]); // 父进程关闭写端while (1){char buf[1024];ssize_t s = read(pipefds[0], buf, sizeof(buf) - 1); // 保证从二进制文件读取到用户进程某位空一个\0if (s == 0){ // 意味着子进程退出了printf("child quit\n");break;}else if (s > 0){buf[s] = 0;printf("child say to father# %s\n", buffer);}else{printf("read error\n");break;}}return 0;
}
父子进程读取和写入分别在文件描述符中fd[3]
和fd[4]
,然后子进程为了写入关闭fd[3]
,父进程为了读取则需要关闭fd[4]
。
2.2.2 命名管道
system V共享内存
即允许一个进程将数据放到进程共享内存块中让其他进程读取这些数据来完成信息交换,此过程不涉及变换状态(内核态和用户态切换),使其速度非常快。
system V共享内存
即允许一个进程将数据放到进程共享内存块中让其他进程读取这些数据来完成信息交换,此过程不涉及变换状态(内核态和用户态切换),使其速度非常快。
相关文章:

进程通信(管道,共享内存实现)
01. 进程通信简介 进程通信工具分为数据传输工具和共享内存两类。这里我们讨论进程通信工具(IPC)里面的管道、system V和共享内存。在理解阶层通信之间,我们先了解用户空间缓冲区和内核空间缓冲区两个概念。 1.1 用户空间缓冲区 存在于用户态的进程用户空间&#…...

电池预测 | 第28讲 基于CNN-GRU的锂电池剩余寿命预测
电池预测 | 第28讲 基于CNN-GRU的锂电池剩余寿命预测 目录 电池预测 | 第28讲 基于CNN-GRU的锂电池剩余寿命预测预测效果基本描述程序设计参考资料 预测效果 基本描述 电池预测 | 第28讲 基于CNN-GRU的锂电池剩余寿命预测 运行环境Matlab2023b及以上,锂电池剩余寿…...

快速上手SHELL脚本常用命令
一、设置主机名称 1.修改文件方式 重启后生效 2.命令修改 重启shell后生效 二、网卡管理nmcli 1.查看网卡 2.设置网卡 详细配置:快速上手Linux联网管理-CSDN博客 三、简单处理字符 1.打印连续数字 2.设置字体颜色 \033[颜色代号m 3.反向打印文件内容 tac&a…...
【无标题】前端如何实现分页?
前端如何实现分页? 以下是对代码的逐条总结与解释,按 HTML、JavaScript、CSS 顺序分模块列出,每条代码单独说明: 一、HTML 代码解释 1. 表格容器 html <table class"table table-bordered table-hover">作用&…...

【自然语言处理与大模型】大模型Agent四大的组件
大模型Agent是基于大型语言模型构建的智能体,它们能够模拟独立思考过程,灵活调用各类工具,逐步达成预设目标。这类智能体的设计旨在通过感知、思考与行动三者的紧密结合来完成复杂任务。下面将从大模型大脑(LLM)、规划…...

小巧高效的目录索引生成软件
软件介绍 本文介绍的软件名为Snap2html,是一款树形目录索引生成工具。 软件大小与便捷性 Snap2html这款软件已完成汉化,其体积仅170kb,小巧无比,且无需安装,可直接投入使用。 软件使用方法 该软件操作简便…...

云原生架构设计相关原则
文章目录 前言云原生架构概述云原生架构的核心原则一切皆服务原则自动化原则韧性和容错原则可观测性原则 云原生架构原则的实践意义 前言 大家好,我是沛哥儿。今天想和大家深入探讨一下云原生架构的相关原则。在如今数字化飞速发展的时代,云原生架构已经…...
android实现使用RecyclerView详细
显示页面代码:activity_category_inventory.xml代码: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android" xmlns:app"http://schemas.and…...

华为云Flexus+DeepSeek征文 | Flexus X实例助力 Dify-LLM 一键部署:性能跃升与成本优化的革新实践
引言 在AI大模型应用快速普及的背景下,企业对低门槛部署、高性能算力与成本可控的需求日益迫切。华为云推出的Flexus X实例,作为专为AI工作负载优化的新一代算力底座,通过1.6倍算力提升、关键业务6倍加速、综合降本30%等核心优势,…...
曼昆经济学原理第九版目录
格里高利曼昆的《经济学原理》(Principles of Economics)通常分为34章(第9版,2024年英文版),分为微观经济学(第1-18章)和宏观经济学(第19-34章)两部分 第一部…...

数据库blog7_MySql的下载与配置准备
🌿MySql下载 🍂1.应用版本选择 选择社区版,免费适合初学者 相关链接下载页面下载界面介绍 🍂2.OS版本选择 根据自己的OS类型(Windows/Linux(CentOS/Ubuntu …)/macOS)选择对应版本…...

YOLOv11助力地铁机场安检!!!一键识别刀具
文末有完整代码出处 随着现代社会的高速发展,交通工具和公共场所的安全管理面临着前所未有的挑战。尤其在机场、地铁、车站等公共安全检查点,如何提高安检效率、精准识别危险物品,成为了亟待解决的问题。在传统的安检过程中,X光图…...

RFID工业读写器的场景化应用选型指南
RFID工业读写器是上海岳冉RFID专为工业场景设计的高性能射频识别设备,核心功能围绕高效数据采集与可靠传输展开。其基础能力包括多协议支持(如ISO 18000-6C)与多标签防碰撞处理,可同时读取/写入EPC编码、用户数据等标签信息&#…...
java中的线程安全的集合
1.ConcurrentHashMap。 key,value结构。 jdk1.7通过分段锁保证不同段同时操作是线程安全的,但并发不足,jdk1.8通过node节点锁和CAS保证并发安全。不同node节点可以并发读写。通过它的computer,computerIfAbsent,等可以保证原子更新value。ifAbsent表示有…...

单片机如何快速实现查看实时数据
在用 Keil 做调试的时候,最让人头秃的是什么? 不是写代码的BUG,而是:这个条件变量是什么情况?为什么没进入这个判断?我代码跑到哪里了? 其实本质上都是通过变量判断代码的执行顺序有没有问题 …...

go实现钉钉三方登录
钉钉的的官方开发文档中只给出了java实现三方登录的,我们准备用go语言来实现 实现网页方式登录应用(登录第三方网站) - 钉钉开放平台 首先就是按照文档进行操作,备注好网站的信息 获得应用凭证,我们后面会用到 之后…...
YOLOv1 详解:单阶段目标检测算法的里程碑
在目标检测领域,YOLO(You Only Look Once)系列算法凭借其高效性和实用性,成为了行业内的明星算法。其中,YOLOv1 作为 YOLO 系列的开山之作,首次提出了单阶段目标检测的思想,彻底改变了目标检测算…...
5G 核心网切换机制全解析:XN、N2 与移动性注册对比
摘要 本文深入探讨了 5G 核心网中的三种关键切换方式:基于 XN 接口的切换、基于 N2 接口的切换以及移动性注册更新机制。通过对比分析它们的原理、应用场景和技术差异,帮助读者全面理解 5G 网络中用户移动性管理的核心技术。 1. 引言 随着 5G 技术的广泛应用,用户对网络连…...

物流配送优化实战:用遗传算法破解选址难题
在电商与供应链高速发展的今天,物流配送成本优化始终是企业竞争力的核心议题之一。想象一下,当你面对 20 个分布在不同坐标的客户点、7 个可选配送中心和 1 个发件网点时,如何用最省钱的方式完成配送?今天我们就来拆解一个真实的物…...

Linux 个人用户设置账号密码环境变量,四种方式
一、需要明白以下2点: 1、Linux 的环境变量是保存在变量 PATH 中,可通过 Linux shell 命令 echo $PATH 查看输出内容,或者直接输入 export 查看,或者输入 env 查看 2、Linux环境变量值之间是通过冒号进行隔开的( : ) 格式为&am…...

Three.js搭建小米SU7三维汽车实战(5)su7登场
汽车模型加载 我们在sktechfab上下载的汽车是glb的文件格式,所以使用gltfLoader进行加载。这里将小车直接加载进来看看效果; import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js"; ....其余代码省略 const gltfLoader new GLT…...
关于 SSE(Server-Sent Events)过程的简要解剖
Js前端:发送普通请求 fetch(...) .then(()>{}) .catch(()>{})Java后端:接收请求后调用请求处理函数,函数返回一个emiiter对象 public SseEmitter handleRequest(...) {// 创建一个 SseEmitter 对象,用于发送 SSE 事件SseE…...

格恩朗管段超声波流量计:流量测量先锋
在流量测量技术不断迭代的浪潮中,格恩朗自 2019 年创立起,便以开拓者的姿态投身其中,致力于为全球用户提供先进、精准的流量测量解决方案。其旗下的管段超声波流量计,一经推出,便迅速吸引了行业的目光,成为…...
重构开发范式!飞算JavaAI革新Spring Cloud分布式系统开发
分布式系统凭借高可用性、可扩展性等核心优势,成为大型软件项目的标配架构。Spring Cloud作为Java生态最主流的分布式开发框架,虽被广泛应用于微服务架构搭建,但其传统开发模式却面临效率瓶颈——从服务注册中心配置到网关路由规则编写&#…...

图论 判断是否有环
前言:有点忘记是怎么判断一个图中是否是有环 如果是一个无向图,其实可以直接dfs,加上一个vis数组来一起判断 如果是有向图呢, class Solution:def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool…...
(请关注)Oracle性能调优、优化总结调优参考直接应用,性能提升实用案例
Oracle性能调优涉及SQL优化、索引设计、参数配置、存储优化等多个方面。以下是一些常见的性能调优方法及示例,涵盖核心场景和最佳实践。 1. SQL优化 示例1:使用绑定变量减少硬解析 ```sql -- 错误示例(硬解析频繁) SELECT * FROM employees WHERE employee_id = 100; …...

EasyDarwin的配置与使用
一.语言配置 准备go语言 All releases - The Go Programming Language 增加系统环境变量 让其生效 二.项目配置 Clone项目并解压 git clone https://github.com/EasyDarwin/EasyDarwin.git cd EasyDarwin go mod tidy 紧接着 make build/linux cd build cd EasyDarwin-lin-&qu…...
PostgreSQL日志管理完整方案(AI)
一、日志系统配置 1.1 核心参数配置 在postgresql.conf中进行以下设置: 启用日志收集:logging_collector on日志存储路径:log_directory ‘/var/log/postgresql’日志命名规则:log_filename ‘postgresql-%a.log’ÿ…...

【Android】基于SurfaceControlViewHost实现跨进程渲染
1 前言 本文将介绍基于 SurfaceControlViewHost 实现跨进程渲染普通 View 和 GlSurfaceView,力求用最简单的 Demo,介绍 SurfaceControlViewHost 的应用,方便读者轻松扣出核心代码应用到自己的业务中。 核心代码片段如下。 1)服务端…...

vue+ThreeJs 创造自动选择的甜甜圈(圆环)
嗨,我是小路。今天主要和大家分享的主题是“vueThreeJs 创造自动选择的甜甜圈”。 一个漂浮在页面中央的 3D 圆环,多个图标/文本/图片均匀分布在圆周上。它会自动缓慢旋转,形成动态视觉焦点。这就是今天要搭建的项目,并对…...