Linux-进程间通信

1.进程间通信介绍

1.1通信目的

数据传输:⼀个进程需要将它的数据发送给另⼀个进程

资源共享:多个进程之间共享同样的资源。

通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)发⽣了某种事件(如进 程终⽌时要通知⽗进程)。

进程控制:有些进程希望完全控制另⼀个进程的执⾏(如Debug进程),此时控制进程希望能够 拦截另⼀个进程的所有陷⼊和异常,并能够及时知道它的状态改变。

1.2进程间通信发展

管道

System V进程间通信

POSIX进程间通信

1.3进程间通信分类

管道:

匿名管道pipe

命名管道

System V IPC :

System V 消息队列

System V 共享内存

System V 信号量

POSIX IPC :

消息队列

共享内存

信号量

互斥量

条件变量

读写锁

2.管道

管道是Unix中最古⽼的进程间通信的形式。

我们把从⼀个进程连接到另⼀个进程的⼀个数据流称为⼀个“管道”

3.匿名管道

3.1示例代码

3.2用fork来共享管道原理

3.3站在⽂件描述符⻆度-深度理解管道

3.4站在内核⻆度-管道本质

3.5管道样例

3.5.1测试管道读写

3.5.2创建进程池处理任务

登录 - Gitee.com

3.6管道读写规则

当没有数据可读时

O_NONBLOCK disable:read调⽤阻塞,即进程暂停执⾏,⼀直等到有数据来到为⽌。

O_NONBLOCK enable:read调⽤返回-1,errno值为EAGAIN

当管道满的时候

O_NONBLOCK disable:write调⽤阻塞,直到有进程读⾛数据

O_NONBLOCK enable:调⽤返回-1,errno值为EAGAIN

如果所有管道写端对应的⽂件描述符被关闭,则read返回0

如果所有管道读端对应的⽂件描述符被关闭,则write操作会产⽣信号SIGPIPE,进⽽可能导致 write进程退出

当要写⼊的数据量不⼤于PIPE_BUF时,linux将保证写⼊的原⼦性。

当要写⼊的数据量⼤于PIPE_BUF时,linux将不再保证写⼊的原⼦性。

3.7管道特点

只能⽤于具有共同祖先的进程(具有亲缘关系的进程)之间进⾏通信;通常,⼀个管道由⼀个进 程创建,然后该进程调⽤fork,此后⽗、⼦进程之间就可应⽤该管道。

管道提供流式服务

⼀般⽽⾔,进程退出,管道释放,所以管道的⽣命周期随进程

⼀般⽽⾔,内核会对管道操作进⾏同步与互斥

管道是半双⼯的,数据只能向⼀个⽅向流动;需要双⽅通信时,需要建⽴起两个管道

3.8管道通信的4中情况

读正常&&写满

写正常&&读空

写关闭&&读正常

读关闭&&写正常

4.命名管道

管道应⽤的⼀个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。

如果我们想在不相关的进程之间交换数据,可以使⽤FIFO⽂件来做这项⼯作,它经常被称为命名 管道。

命名管道是⼀种特殊类型的⽂件

4.1创建一个命名管道

4.2匿名管道和命名管道的区别

匿名管道由pipe函数创建并打开。

命名管道由mkfifo函数创建,打开⽤open

IFO(命名管道)与pipe(匿名管道)之间唯⼀的区别在它们创建与打开的⽅式不同,⼀但这些 ⼯作完成之后,它们具有相同的语义。

4.3命名管道的打开原则

如果当前打开操作是为读⽽打开FIFO时:

O_NONBLOCK disable:阻塞直到有相应进程为写⽽打开该FIFO

O_NONBLOCK enable:⽴刻返回成功

如果当前打开操作是为写⽽打开FIFO时:

O_NONBLOCK disable:阻塞直到有相应进程为读⽽打开该FIFO

O_NONBLOCK enable:⽴刻返回失败,错误码为ENXIO

实例1.⽤命名管道实现⽂件拷⻉

读取⽂件,写⼊命名管道:

读取管道,写⼊⽬标⽂件:

实例2.⽤命名管道实现server&client通信

5.system V共享内存

共享内存区是最快的IPC形式。⼀旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递 不再涉及到内核,换句话说是进程不再通过执⾏进⼊内核的系统调⽤来传递彼此的数据

5.1共享内存示意图

5.2共享内存数据结构

5.3共享内存函数

实例1.共享内存实现通信

测试代码结构

实例2.借助管道实现访问控制版的共享内存

 6.system V 消息队列

消息队列提供了⼀个从⼀个进程向另外⼀个进程发送⼀块数据的⽅法

每个数据块都被认为是有⼀个类型,接收者进程接收的数据块可以有不同的类型值

特性⽅⾯:

PC资源必须删除,否则不会⾃动清除,除⾮重启,所以systemVIPC资源的⽣命周期随内核

7system V 信号量

信号量主要⽤于同步和互斥的,下⾯先来看看什么是同步和互斥。

7.1并发编程,概念铺垫

多个执⾏流(进程),能看到的同⼀份公共资源:共享资源

被保护起来的资源叫做临界资源

保护的⽅式常⻅:互斥与同步

任何时刻,只允许⼀个执⾏流访问资源,叫做互斥

多个执⾏流,访问临界资源的时候,具有⼀定的顺序性,叫做同步

系统中某些资源⼀次只允许⼀个进程使⽤,称这样的资源为临界资源或互斥资源。

在进程中涉及到互斥资源的程序段叫临界区。你写的代码=访问临界资源的代码(临界区)+不访问 临界资源的代码(⾮临界区)

所谓的对共享资源进⾏保护,本质是对访问共享资源的代码进⾏保护

7.2信号量

特性⽅⾯:

IPC资源必须删除,否则不会⾃动清除,除⾮重启,所以systemVIPC资源的⽣命周期随内核

理解⽅⾯:

信号量是⼀个计数器

作⽤⽅⾯:

保护临界区

本质⽅⾯:

信号量本质是对资源的预订机制

操作⽅⾯:

申请资源,计数器--,P操作

释放资源,计数器++,V操作

8内核是如何组织管理IPC资源的

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

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

相关文章

精益数据分析(69/126):最小可行化产品(MVP)的设计、验证与数据驱动迭代

精益数据分析(69/126):最小可行化产品(MVP)的设计、验证与数据驱动迭代 在创业旅程中,从需求洞察到产品落地的关键一跃是打造最小可行化产品(MVP)。今天,我们结合《精益…

从JavaScript快速上手Python:关键差异与核心技巧

引言 如果你是JavaScript开发者,可能会对Python的简洁语法和丰富的生态感兴趣。但两种语言的设计哲学和实现细节存在显著差异。本文将通过对比JS与Python的核心概念,帮助你快速过渡,避免“踩坑”。 一、语法差异:告别大括号&#…

TransmittableThreadLocal实现上下文传递-笔记

1.TransmittableThreadLocal简介 com.alibaba.ttl.TransmittableThreadLocal(简称 TTL)是阿里巴巴开源的一个工具类,旨在解决 ThreadLocal 在线程池中无法传递上下文变量 的问题。它是对 InheritableThreadLocal 的增强,尤其适用…

TDengine 安全部署配置建议

背景 TDengine 的分布式、多组件特性导致 TDengine 的安全配置是生产系统中比较关注的问题。本文档旨在对 TDengine 各组件及在不同部署方式下的安全问题进行说明,并提供部署和配置建议,为用户的数据安全提供支持。 安全配置涉及组件 TDengine 包含多…

在Cursor中启用WebStorm/IntelliJ风格快捷键

在Cursor中启用WebStorm/IntelliJ风格快捷键 方法一:使用预置快捷键方案 打开快捷键设置 Windows/Linux: Ctrl K → Ctrl SmacOS: ⌘ K → ⌘ S 搜索预设方案 在搜索框中输入keyboard shortcuts,选择Preferences: Open Keyboard Shortcuts (JSON) …

python打卡day30@浙大疏锦行

知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 具体操作步骤: 在桌面…

【kafka】基本命令

创建 Kafka Topic 的命令 以下是创建 Kafka Topic 的几种常用方法&#xff1a; 1. 使用 kafka-topics.sh 基础命令&#xff08;Kafka 自带工具&#xff09; bin/kafka-topics.sh --create \--bootstrap-server <broker地址:端口> \--topic <topic名称> \--parti…

编程速递:适用于 Delphi 12.3 的 FMX Linux 现已推出

Embarcadero非常高兴地宣布&#xff0c;用于使用Delphi构建Linux客户端应用程序的FMX Linux UI库再次在RAD Studio 12.3版本以及RAD Studio 12.2版本中提供支持&#xff0c;同时也适用于更早的版本。 作为RAD Studio的一个附加库&#xff0c;FMX Linux为开发面向Linux的图形用…

通过实例讲解螺旋模型

目录 一、螺旋模型的核心概念 二、螺旋模型在电子商城系统开发中的应用示例 第 1 次螺旋:项目启动与风险初探

vue3 vite 路由

如路由是这种格式 http://localhost:7058/admin/product/brand路由配置如下 import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vue import NProgress from nprogress; import nprogress/nprogress.css; import {errorRour…

【Redis】Hash 存储相比 String 存储的优势

在 Redis 中&#xff0c;Hash 存储相比 String 存储具有以下 优势&#xff0c;特别适用于某些特定场景&#xff1a; ✅ 1. 更节省内存&#xff08;尤其适合存储对象&#xff09; Hash 内部使用压缩列表&#xff08;ziplist&#xff09;或哈希表实现&#xff0c;在数据量较小时…

CSS详解:特性、选择器与优先级

CSS详解&#xff1a;特性、选择器与优先级 目录 CSS详解&#xff1a;特性、选择器与优先级一、CSS的核心特性1. 层叠性&#xff08;Cascading&#xff09;2. 继承性&#xff08;Inheritance&#xff09;3. 优先级&#xff08;Specificity&#xff09;4. 响应式设计5. 动画与过渡…

《算法导论(第4版)》阅读笔记:p86-p90

《算法导论(第4版)》学习第 19 天&#xff0c;p83-p85 总结&#xff0c;总计 3 页。 一、技术总结 无。 二、英语总结(生词&#xff1a;2) 1. inkling (1)inkling: inclen(“utter in an undertone&#xff0c;低声说话”) c. a hint(提示)&#xff1b;a slight knowledg…

nginx概念及使用

一、Nginx 核心概念 Nginx&#xff08;发音为 "engine-x"&#xff09;是一个高性能、开源的 Web 服务器和反向代理服务器&#xff0c;由俄罗斯工程师伊戈尔・赛索耶夫&#xff08;Igor Sysoev&#xff09;于 2004 年开发&#xff0c;最初用于解决当时高并发场景下 Ap…

2025蓝桥杯JAVA编程题练习Day8

1. 路径 题目描述 小蓝学习了最短路径之后特别高兴&#xff0c;他定义了一个特别的图&#xff0c;希望找到图 中的最短路径。 小蓝的图由 2021 个结点组成&#xff0c;依次编号 1 至 2021。 对于两个不同的结点 a, b&#xff0c;如果 a 和 b 的差的绝对值大于 21&#xff0…

【赵渝强老师】Memcached的路由算法

Memcached支持两种不同方式的客户端路由算法&#xff0c;即&#xff1a;求余数Hash算法和一致性Hash算法。下面分别进行介绍。 一、 求余数的路由算法 求余数Hash算法的客户端路由是对插入数据的键进行求余数&#xff0c;根据余数来决定存储到哪个Memcached实例。 视频讲解如…

NLP学习路线图(一): 线性代数(矩阵运算、特征值分解等)

引言&#xff1a;语言与矩阵的奇妙邂逅 在自然语言处理&#xff08;NLP&#xff09;的魔法世界里&#xff0c;每个词语都像被施了变形术的精灵&#xff0c;在数学的殿堂中翩翩起舞。当我们用"king - man woman queen"这样的向量魔法破解语义密码时&#xff0c;线性…

BUUCTF PWN刷题笔记(持续更新!!)

ciscn_2019_c_1 64位&#xff0c;没有开启保护。点进去没发现明显的漏洞函数&#xff0c;考虑泄露libc基地址的rop构造。先看看有多少gadget 估计也够用了。puts函数只接受一个参数&#xff0c;观看汇编看看用的哪个寄存器传输的参数。 用的是edi。但是我们怎么找到so的版本呢…

Java EE初阶——线程安全

1. 线程的状态 1. 线程状态分类&#xff08;Thread.State 枚举&#xff09; Java 定义了 6 种线程状态&#xff0c;这些状态均由 java.lang.Thread.State 枚举表示&#xff1a; NEW&#xff08;新建&#xff09; 线程对象已创建&#xff0c;但尚未调用 start() 方法。此时线程…

Vue 3.0中响应式依赖和更新

响应式依赖和更新是Vue 3.0中最重要的机制&#xff0c;其核心代码如下&#xff0c;本文将结合代码对这个设计机制作出一些解释。 // 全局依赖存储&#xff1a;WeakMap<target, Map<key, Set<effect>>> const targetMap new WeakMap();// 当前活动的副作用函…