当前位置: 首页 > ops >正文

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.xdnf.cn/news/7219.html

相关文章:

  • Redis有哪些常用应用场景?
  • Kubernetes MCP服务器(K8s MCP):如何使用?
  • upload-labs通关笔记-第12关 文件上传之白名单GET法
  • 【Unity 2023 新版InputSystem系统】新版InputSystem 如何进行人物移动(包括配置、代码详细实现过程)
  • 【软考-架构】15、软件架构的演化和维护
  • 第2篇 水滴穿透:IGBT模块的绝对防御体系
  • NIFI 2.40简介及部署
  • python实现pdf转图片(针对每一页)
  • 手机内存不够,哪些文件可以删?
  • 电气材料的分类及应用
  • MySQL 8.0 OCP 英文题库解析(五)
  • python文件部署docker,容器路径与系统路径映射
  • ionic 列表操作详解
  • 基于vue框架的东莞市二手相机交易管理系统5yz0u(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 解决Windows磁盘管理中因夹卷导致的无法分区问题
  • 146. LRU 缓存
  • 自己拥有一台服务器可以做哪些事情
  • 科技行业智能化升级经典案例—某芯片公司
  • Perl测试管理:从混乱到高效的系统化实践
  • 《DiffPoint训练过程详解:从图像到点云的逐步优化》
  • B树与B+树全面解析
  • Vue3.5 企业级管理系统实战(十九):菜单管理
  • 开发 前端搭建npm v11.4.0 is known not to run on Node.js v14.18.1.
  • Ansible模块——主机名设置和用户/用户组管理
  • 02-前端Web开发(JS+Vue+Ajax)
  • 用Python实现数据库数据自动化导出PDF报告:从MySQL到个性化文档的全流程实践
  • 【工具使用】STM32CubeMX-片内Flash读写操作
  • DTAS 3D多约束装配助力悬架公差分析尺寸链计算:麦弗逊/双叉臂/多连杆/H臂一网打尽
  • 软件设计师“开发过程模型:瀑布、增量、原型、螺旋、喷泉、基于构件的开发模型、形式化方法模型、统一过程RUP、敏捷、极限”真题考点分析——求三连
  • 从虚拟仿真到行业实训再到具身智能--华清远见嵌入式物联网人工智能全链路教学方案