嵌入式Linux-进程间通信

news2024/9/28 1:23:04

1.进程间通信

1.1 进程间通信的介绍

进程间通信(interprocess communication,简称 IPC)指两个进程之间的通信。系统中的每一个进程都有各自的地址空间,并且相互独立、隔离,每个进程都处于自己的地址空间中。所以同一个进程的不同模块(譬如不同的函数)之间进行通信都是很简单的,譬如使用全局变量等。

但是,两个不同的进程之间要进行通信通常是比较难的,因为这两个进程处于不同的地址空间中;通常情况下,大部分的程序是不要考虑进程间通信的,因为大家所接触绝大部分程序都是单进程程序(可以有多个线程),对于一些复杂、大型的应用程序,则会根据实际需要将其设计成多进程程序,譬如 GUI、服务区应用程序等。

在一些中小型应用程序中通常不会将应用程序设计成多进程程序,自然而然便不需要考虑进程间通信的问题,所以,本章内容以了解为主、了解进程间通信以及内核提供的进程间通信机制,并不详解介绍进程间通信,如果大家在今后的工作当中参与开发的应用程序是一个多进程程序、需要考虑进程间通信的问题,此时再去深入学习这方面的知识!

1.2 进程间通信的机制有哪些?

Linux 内核提供了多种 IPC 机制,基本是从 UNIX 系统继承而来,而对 UNIX 发展做出重大贡献的两大主力 AT&T 的贝尔实验室及 BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对 UNIX 早期的进程间通信手段进行了系统的改进和扩充,形成了“System V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接字(Socket,也就是网络)的进程间通信机制。Linux 则把两者继承了下来,如下如所示:
在这里插入图片描述
其中,早期的 UNIX IPC 包括:管道、FIFO、信号;System V IPC 包括:System V 信号量、System V消息队列、System V 共享内存;上图中还出现了 POSIX IPC,事实上,较早的 System V IPC 存在着一些不足之处,而 POSIX IPC 则是在 System V IPC 的基础上进行改进所形成的,弥补了 System V IPC 的一些不足之处。POSIX IPC 包括:POSIX 信号量、POSIX 消息队列、POSIX 共享内存。

总结如下:

  1. UNIX IPC:管道、FIFO、信号;
  2. System V IPC:信号量、消息队列、共享内存;
  3. POSIX IPC:信号量、消息队列、共享内存;
  4. Socket IPC:基于 Socket 进程间通信。

下面我们一一的简单介绍:

1.3 管道和 FIFO

管道是 UNIX 系统上最古老的 IPC 方法,它在 20 世纪 70 年代早期 UNIX 的第三个版本上就出现了。把一个进程连接到另一个进程的数据流称为管道,管道被抽象成一个文件;(相信大家在初学Linux基础操作的时候,也曾经犯难过)

管道包括三种:

  1. 普通管道 pipe:通常有两种限制,一是单工,数据只能单向传输;二是只能在父子或者兄弟进程间使用;
  2. 流管道 s_pipe:去除了普通管道的第一种限制,为半双工,可以双向传输;只能在父子或兄弟进程间使用;
  3. 有名管道 name_pipe(FIFO):去除了普通管道的第二种限制,并且允许在不相关(不是父子或兄弟关系)的进程间进行通讯。

tips:普通管道可用于具有亲缘关系的进程间通信,并且数据只能单向传输,如果要实现双向传输,则必须要使用两个管道;而流管道去除了普通管道的第一种限制,可以半双工的方式实现双向传输,但也只能在具有亲缘关系的进程间通信;而有名管道(FIFO)则同时突破了普通管道的两种限制,即可实现双向传输、又能在非亲缘关系的进程间通信。

1.4 消息队列

消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺陷。消息队列包括 POSIX 消息队列和 System V 消息队列。

消息队列是 UNIX 下不同进程之间实现共享资源的一种机制,UNIX 允许不同进程将格式化的数据流以消息队列形式发送给任意进程,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。

1.5 信号量

信号量是一个计数器,与其它进程间通信方式不大相同,它主要用于控制多个进程间或一个进程内的多个线程间对共享资源的访问,相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志,除了用于共享资源的访问控制外,还可用于进程同步。

它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源,因此,主要作为进程间以及同一个进程内不同线程之间的同步手段。Linux 提供了一组精心设计的信号量接口来对信号量进行操作,它们声明在头文件 sys/sem.h 中。

1.6 共享内存

共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但其它的多个进程都可以访问,使得多个进程可以访问同一块内存空间。共享内存是最快的 IPC 方式,它是针对其它进程间通信方式运行效率低而专门设计的,它往往与其它通信机制,譬如结合信号量来使用,以实现进程间的同步和通信。

1.7 套接字(Socket)

Socket 是一种 IPC 方法,是基于网络的 IPC 方法,允许位于同一主机(计算机)或使用网络连接起来的不同主机上的应用程序之间交换数据,说白了就是网络通信,在提高篇章节内容中将会向大家介绍 Linux系统下的网络编程。

本文参考正点原子的嵌入式LinuxC应用编程。

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

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

相关文章

【自学Docker】Docker attach命令

Docker attach命令 大纲 docker attach教程 使用 docker attach 命令可以用来进入到一个正在运行的 Docker容器。docker attach 命令后面的 CONTAINER 可以是容器Id,或者是容器名。 要能够使用 docker attach 的容器必须是正在运行的。 docker attach语法 haic…

# Itext Pdf 5 教程

Itext Pdf 5 教程 Itext Pdf Itext7收费&#xff0c;故使用Itext5传统版&#xff0c;Itext5不再维护 官网&#xff1a;iText 5 |iText PDF Itext5 Java Api 地址&#xff1a;iText 5 Java | iText PDF 依赖 <!-- itextpdf --> <dependency><groupId>c…

视频编辑:VisioForge Video Edit SDK .Net 15.5 标准版 Crack

视频编辑&#xff1a;VisioForge Video Edit SDK .Net v15.5 标准版 Crack,我没有专业版&#xff0c;希望你提供 VisioForge Video Edit SDK .Net 允许程序员轻松地将视频编辑和处理功能集成到他们的软件应用程序中。SDK 允许您使用任何音频和视频文件创建您的电影。您可以为其…

2022年游戏安全风险增长96%,高维作弊对抗激烈

导读&#xff1a;2022年&#xff0c;游戏行业在多种因素影响下遭遇寒冬。但游戏黑灰产规模在迅速壮大&#xff0c;不少游戏饱受其侵扰&#xff0c;越来越多的游戏厂商开始重视游戏安全问题。 为帮助游戏厂商能够清晰、直观地了解当前游戏安全对抗形势&#xff0c;在经过多轮调…

【虹科云展厅专题】虹科赋能汽车智能化云展厅——汽车总线专题

虹科2023年开年福利 聚焦前沿技术&#xff0c;【虹科赋能汽车智能化云展厅】正式上线&#xff0c;本次云展厅围绕“汽车以太网/TSN、汽车总线、智能网联、电子测试与验证、自动驾驶”等核心话题&#xff0c;为您带来如临展会现场般的讲演与介绍&#xff0c;更有技术工程师全程…

机智云DUT实现远程智能鱼池管理系统

一、前言机智云研发的4G DTU在养殖智能系统管理方面优势&#xff0c;此处以智能鱼池管理系统为例。1.实时数据监控机智云智能鱼池养殖智能系统实现对整个鱼池水质的实时监控&#xff0c;无人值守设备状态下运行。为客管理者提供实时异常数据报警信息、实时环境参数波动、实时/定…

nacos的安装部署

文章目录1.nacos的下载2.nacos数据库的建立3.nacos配置文件修改3.1配置文件3.2设置单点登录4.登录nacos网页1.nacos的下载 下载地址&#xff1a; https://github.com/alibaba/nacos/releases 根据自己的需要下载合适的版本。 2.nacos数据库的建立 navicat运行nacos下conf的…

【深度】从链上分析和金融安全角度,看stETH的囚徒困境和Celsius挤兑事件

6月7日开始&#xff0c;以Celsius被曝损失 3.5 万枚 ETH开始&#xff0c;ETH流动性生态乃至整个加密货币市场进入到一个以stETH为中心的流动性囚徒困境之中&#xff0c;而这也造成了对Celsius等加密货币“银行”挤兑现象的发生。 SharkTeam将从事件的起源开始&#xff0c;也就…

拆解“算力偏科”难题,智算中心下一步向何处去?

十年前&#xff0c;英国《经济学人》曾用工业用电量为主的指标来评估中国GDP&#xff0c;而现在算力已经成为新的指标。似乎每个企业、每个城市都在努力增加算力。一位读者不无困惑地留言&#xff0c;大家都说自己算力有多少FLOPS&#xff0c;能支撑这个大模型、那个大数据&…

九龙证券|北上资金连续10日“跑步入场”,1月净流入已逼近2022全年

1月以来&#xff0c;北上资金净流入规划已接近2022全年。 半导体概念股集体大涨 1月17日&#xff0c;沪指缩量小幅调整&#xff0c;收跌0.1%&#xff1b;深成指涨0.13%&#xff0c;创业板指收涨0.24%&#xff0c;科创50涨逾1%。 板块方面&#xff0c;半导体及元件板块继续走强…

基于.NetCore+React单点登录系统

更多开源项目请查看&#xff1a; 一个专注推荐.Net开源项目的榜单 对于有多个应用系统的企业来说&#xff0c;每一个应用系统都有自己的用户体系&#xff0c;这就造成用户在切换不同应用系统时&#xff0c;就要多次输入账号密码&#xff0c;导致体验非常不好&#xff0c;也造成…

【vue系列-07】vue脚手架的基本使用

深入理解脚手架的使用一&#xff0c;vue脚手架的基本使用1&#xff0c;vue-cli安装2&#xff0c;vue项目中的文件组成3&#xff0c;render配置项4&#xff0c;ref属性5&#xff0c;props属性6&#xff0c;mixin属性7&#xff0c;scope属性一&#xff0c;vue脚手架的基本使用 在…

vsftpd使用指北

vsftpd使用指北 文章目录vsftpd使用指北1.安装vsftpd2.登录3.切换本地路径下载命令&#xff1a;get用于下载单个文件&#xff1a;mget用于批量下载&#xff1a;上传命令&#xff1a;FilezillaReferencevsftpd 是“very secure FTP daemon”的缩写&#xff0c;是一个完全免费的、…

Vue组件化

1、Vue组件化开发思想 1.1、认识组件化开发 组件化也是类似的思想&#xff1a; 如果我们将一个页面中所有的处理逻辑全部放在一起&#xff0c;处理起来就会变得非常复杂&#xff0c;而且不利于后续的管理以及扩展&#xff1b;但如果&#xff0c;我们讲一个页面拆分成一个个小…

【算法竞赛学习】csoj:寒假第一场

文章目录前言新年礼物灯笼展摩天楼神抽新年大礼前言 由于本人菜鸡&#xff0c;所以大多都是使用出题人的代码和思路 如有侵权&#xff0c;麻烦联系up删帖&#xff0c;本贴仅作为笔记记录 本篇大多是在吹水&#xff0c;技术方面可以直接看代码注释&#xff0c;思路在水文中&am…

Linux下的进程通信之管道通信

目录 进程间通信的背景 为什么要进行进程间通信&#xff1f; 管道 什么是管道&#xff1f; 匿名管道 匿名管道原理 如何创建匿名管道&#xff1f; 命名管道 进程间通信的背景 进程间通信就是在不同的进程之间进行的数据的交换&#xff0c;进程间通信又称为Interproces…

Python SciPy 空间数据

SciPy 空间数据空间数据又称几何数据&#xff0c;它用来表示物体的位置、形态、大小分布等各方面的信息&#xff0c;比如坐标上的点。SciPy 通过 scipy.spatial 模块处理空间数据&#xff0c;比如判断一个点是否在边界内、计算给定点周围距离最近点以及给定距离内的所有点。三角…

【学Vue就跟玩一样】组件的自定义事件和全局事件总线

一&#xff0c;自定义事件1.自定义事件是什么自定义事件一种组件间通信的方式&#xff0c;适用于 子组件 ——> 父组件传输数据等2.要在什么地方使用若App是父组件&#xff0c;School是子组件&#xff0c;School想给App传数据&#xff0c;那么就要在App中给School绑定自定义…

使用k8s实现灰度发布,金丝雀,蓝绿发布

介绍#Ingress-Nginx 是一个K8S ingress工具&#xff0c;支持配置 Ingress Annotations 来实现不同场景下的灰度发布和测试。 Nginx Annotations 支持以下 4 种 Canary 规则&#xff1a;nginx.ingress.kubernetes.io/canary-by-header&#xff1a;基于 Request Header 的流量切分…

ThreadLocal底层原理

ThreadLocal底层原理一&#xff1a;什么是ThreadLocal二&#xff1a;理解ThreadLocal中的内存泄漏问题三&#xff1a;ThreadLocalMap中的Hash冲突处理四&#xff1a;可以被继承的ThreadLocal——InheritableThreadLocal一&#xff1a;什么是ThreadLocal ThreadLocal是一个创建…