通过共享内存进行通信(嵌入式学习)

news2024/9/21 14:44:10

通过共享内存进行通信

  • 概念
  • 特点
  • 函数
  • 示例代码

概念

在Linux中,共享内存是一种进程间通信(IPC)机制,允许多个进程共享同一块内存区域。这种通信方式可以提供高效的数据传输,特别适用于需要频繁交换数据的场景。
在这里插入图片描述

IO间进程通信请点击这里——》IO进程间的通信详解(嵌入式学习)

IO进程间的通信详解(嵌入式学习)《——这里
IO进程间的通信详解(嵌入式学习)《——这里这里里

要在Linux中使用共享内存,需要以下步骤:

  1. 创建共享内存段:使用shmget系统调用创建一个共享内存段。该调用需要指定共享内存标识符、内存大小和权限等参数。如果共享内存已经存在,则可以使用shmget的返回值获取该共享内存段的标识符。

  2. 连接共享内存段:使用shmat系统调用将共享内存段连接到当前进程的地址空间中。shmat需要指定共享内存段的标识符和附加选项。成功连接后,shmat将返回指向共享内存段的指针。

  3. 使用共享内存:一旦连接到共享内存段,进程可以像使用普通内存一样使用共享内存。可以读取、写入数据,进行同步操作等。

  4. 分离共享内存段:当进程不再需要使用共享内存段时,可以使用shmdt系统调用将其与当前进程分离。这将使得共享内存段不再对该进程可见,但不会删除该共享内存段。

  5. 删除共享内存段:当所有进程都不再需要使用共享内存段时,可以使用shmctl系统调用删除该共享内存段。这将释放共享内存并将其从系统中删除。

要使用共享内存,需要包含<sys/ipc.h><sys/shm.h>头文件,并链接到-lrt库。

请注意,共享内存需要进程之间进行适当的同步和互斥操作,以避免竞态条件和数据损坏。通常,使用信号量或其他同步机制来控制对共享内存的访问。

特点

共享内存在进程间通信(IPC)中具有以下特点:

  1. 高效性:共享内存提供了一种高效的数据传输方式,因为数据直接存储在共享内存中,而不需要进行进程间的数据复制。这比其他IPC机制(如管道或消息队列)更快。

  2. 大容量:共享内存可以提供较大的内存空间供多个进程共享。这使得它特别适用于需要频繁交换大量数据的场景。

  3. 实时性:由于共享内存的直接访问性质,进程可以即时地读取和写入共享内存中的数据,使得共享内存在实时应用程序中非常有用。

  4. 简单性:相对于其他IPC机制,使用共享内存进行通信相对较简单。进程可以像访问本地内存一样直接读写共享内存,无需复杂的读取或写入操作。

  5. 零拷贝:共享内存的实现方式通常使用"零拷贝"技术,即数据从一个进程的地址空间传输到另一个进程的地址空间时,避免了数据的中间复制,提高了数据传输的效率。

然而,共享内存也存在一些注意事项:

  1. 同步问题:由于多个进程可以同时访问共享内存,必须进行适当的同步操作,以避免竞态条件和数据不一致的问题。通常使用信号量、互斥锁等同步机制来控制对共享内存的访问。

  2. 生命周期管理:在使用共享内存时,需要确保在合适的时间创建、连接、分离和删除共享内存段。如果没有适当管理共享内存的生命周期,可能会导致内存泄漏或无法访问共享内存的情况。

  3. 安全性:共享内存不提供进程间的安全性保护机制,因此必须确保对共享内存的访问受到适当的权限控制,防止未经授权的进程访问共享内存。

综上所述,共享内存是一种高效、快速的进程间通信机制,适用于需要高吞吐量和实时性的应用程序。但在使用时需要注意同步、生命周期管理和安全性等方面的问题。

函数

在Linux中,可以使用以下函数来操作共享内存:

  1. int shmget(key_t key, size_t size, int shmflg)

    • 该函数创建或打开一个共享内存段。
    • 参数key是用于标识共享内存段的键值。
    • 参数size指定共享内存段的大小。
    • 参数shmflg指定一些标志选项,例如权限和创建标志。
    • 返回值是共享内存段的标识符(非负整数),如果失败则返回-1。
  2. void *shmat(int shmid, const void *shmaddr, int shmflg)

    • 该函数将共享内存段连接到当前进程的地址空间。
    • 参数shmid是共享内存段的标识符。
    • 参数shmaddr指定要连接的地址,通常设置为NULL,让内核选择一个可用地址。
    • 参数shmflg指定一些标志选项,例如读写权限和标志。
    • 返回值是指向共享内存段的指针,如果失败则返回-1
  3. int shmdt(const void *shmaddr)

    • 该函数将共享内存段与当前进程分离。
    • 参数shmaddr是要分离的共享内存段的指针。
    • 返回值为0表示成功,-1表示失败。
  4. int shmctl(int shmid, int cmd, struct shmid_ds *buf)

    • 该函数用于控制共享内存段的属性。
    • 参数shmid是共享内存段的标识符。
    • 参数cmd指定要执行的命令,如删除共享内存段。
    • 参数buf是一个指向struct shmid_ds结构的指针,用于获取或设置共享内存段的属性。
    • 返回值为0表示成功,-1表示失败。

这些函数在<sys/ipc.h><sys/shm.h>头文件中声明。要使用共享内存,您还需要链接到-lrt库。

这只是共享内存函数的基本介绍,您可以参考相关文档和教程以获取更详细的信息和示例代码。

示例代码

以下是一个简单的示例代码,展示如何使用共享内存在两个进程之间进行通信:
在这里插入图片描述

进程A(写入数据到共享内存):

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SHM_SIZE 1024

int main() {
    int shmid;
    key_t key;
    char *shm_ptr;

    // 生成共享内存的key
    key = ftok("/tmp", 'R');
    if (key == -1) {
        perror("ftok");
        exit(1);
    }

    // 创建共享内存段
    shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666);
    if (shmid == -1) {
        perror("shmget");
        exit(1);
    }

    // 连接共享内存段到当前进程的地址空间
    shm_ptr = shmat(shmid, NULL, 0);
    if (shm_ptr == (char *)-1) {
        perror("shmat");
        exit(1);
    }

    // 写入数据到共享内存
    sprintf(shm_ptr, "Hello, shared memory!");

    // 分离共享内存段
    if (shmdt(shm_ptr) == -1) {
        perror("shmdt");
        exit(1);
    }

    return 0;
}

进程B(从共享内存中读取数据):

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SHM_SIZE 1024

int main() {
    int shmid;
    key_t key;
    char *shm_ptr;

    // 获取共享内存的key
    key = ftok("/tmp", 'R');
    if (key == -1) {
        perror("ftok");
        exit(1);
    }

    // 获取共享内存段的标识符
    shmid = shmget(key, SHM_SIZE, 0666);
    if (shmid == -1) {
        perror("shmget");
        exit(1);
    }

    // 连接共享内存段到当前进程的地址空间
    shm_ptr = shmat(shmid, NULL, 0);
    if (shm_ptr == (char *)-1) {
        perror("shmat");
        exit(1);
    }

    // 从共享内存中读取数据并打印
    printf("Message from shared memory: %s\n", shm_ptr);

    // 分离共享内存段
    if (shmdt(shm_ptr) == -1) {
        perror("shmdt");
        exit(1);
    }

    // 删除共享内存段
    if (shmctl(shmid, IPC_RMID, NULL) == -1) {
        perror("shmctl");
        exit(1);
    }

    return 0;
}

在这个示例中,进程A创建了一个大小为1024字节的共享内存段,并写入了一条消息到共享内存中。进程B通过共享内存的键获取到该共享内存段的标识符,并连接到当前进程的地址空间,然后读取共享内存中的数据并打印出来。最后,进程B从共享内存中分离,并使用shmctl函数将共享内存段删除。

请注意,在实际使用中,需要确保进程A和进程B以正确的顺序执行,以便正确地进行共享内存的创建、连接和分离。此外,需要进行适当的同步和互斥操作,以避免竞态条件和数据损坏。

编译和运行示例代码时,需要使用gcc编译器,并链接到-lrt库:

gcc processA.c -o processA -lrt
gcc processB.c -o processB -lrt

然后分别运行进程A和进程B:

./processA
./processB

进程B会输出从共享内存中读取的消息。

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

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

相关文章

【运动控制】安装固高运动控制卡驱动程序

【运动控制】安装固高运动控制卡驱动程序 1、背景2、卸载PCI设备3、安装驱动4、安装验证 1、背景 运动控制卡是用来做什么的&#xff1f;顾名思义&#xff0c;用来控制电机转动的。 本博客简单介绍固高科技(深圳)有限公司的运动控制卡的驱动安装。 在购买了固高控制卡后&…

网络层(3)6/12

1.网络层 网络层最大的特点就是提供路由&#xff0c;路由就是分组从源到目的地址时&#xff0c;绝定的端到端的路径 路由&#xff1a;路由是网络层最主要的工作任务 网关&#xff1a;一个网络域到另一个网络域的关卡&#xff0c;主要用于不同网段之间的通讯 路由的获取方式&…

OpenGL之鼠标拾取和模型控制

文章目录 鼠标拾取转化步骤步骤 0&#xff1a;2D 视口坐标步骤 1&#xff1a;3D 规范化设备坐标步骤2&#xff1a;4d 均匀剪辑坐标步骤3&#xff1a;4D 眼&#xff08;相机&#xff09;坐标步骤4&#xff1a;4d 世界坐标 源码 模型控制源码 鼠标拾取 转化步骤 使用鼠标单击或“…

PMP考试成绩查询流程

具体查询方法如下 当你在PMI的注册邮箱收到一封PMI发来的&#xff0c;标题为&#xff1a; 祝贺您获得PMP认证的邮件时&#xff0c;表明你通过了PMP考试。 若没收到邮件&#xff0c;可通过以下方式进行成绩查询&#xff1a; 1、打开PMI官网&#xff1a;www.pmi.org&#xff0…

给初级测试工程师的一些避坑建议

我遇到的大多数开发人员都不怎么热衷于测试。有些会去做测试&#xff0c;但大多数都不测试&#xff0c;不愿意测试&#xff0c;或者勉而为之。我喜欢测试&#xff0c;并且比起编写新的代码&#xff0c;愉快地花更多的时间在测试中。我认为&#xff0c;正是因为专注于测试&#…

【文生图系列】基础篇-变分推理(数学推导)

文章目录 KL散度前向 vs 反向 KL前向KL反向KL可视化 问题描述变分推理ELBO: Evidence Lower Bound参考 此篇博文主要介绍什么是变分推理(Variational Inference , VI)&#xff0c;以及它的数学推导公式。变分推理&#xff0c;是机器学习中一种流行的方式&#xff0c;使用优化的…

LLMs模型速览(GPTs、LaMDA、GLM/ChatGLM、PaLM/Flan-PaLM、BLOOM、LLaMA、Alpaca)

文章目录 一、 GPT系列1.1 GPTs&#xff08;OpenAI&#xff0c;2018——2020&#xff09;1.2 InstructGPT&#xff08;2022-3&#xff09;1.2.1 算法1.2.2 损失函数 1.3 ChatGPT&#xff08;2022.11.30&#xff09;1.4 ChatGPT plugin1.5 GPT-4&#xff08;2023.3.14&#xff0…

【kubernetes】集群架构介绍与基础环境准备

前言:二进制部署kubernetes集群在企业应用中扮演着非常重要的角色。无论是集群升级,还是证书设置有效期都非常方便,也是从事云原生相关工作从入门到精通不得不迈过的坎。通过本系列文章,你将从虚拟机准备开始,到使用二进制方式从零到一搭建起安全稳定的高可用kubernetes集…

Something of Information Security Management

1、信息安全管理基本概念&#xff0c;管理的目标、对象的基本内容、必要性。 信息安全管理是指通过制定和实施一系列的管理措施&#xff0c;保护信息系统中的信息资源免受各种威胁和风险的侵害&#xff0c;确保信息系统的安全、可靠、高效运行。信息安全管理的基本概念包括&…

java 文本处理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目文本分词算法

一、源码特点 java 文本处理系统是一套完善的java web信息管理系统&#xff0c;利用java 对文本语句进行分词&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,Myeclipse…

paddlespeech asr语音转录文字;sherpa 实时语音转录

1、paddlespeech asr语音转录文字 参考&#xff1a; https://github.com/PaddlePaddle/PaddleSpeech 安装后运行可能会numpy相关报错&#xff1b;可能是python和numpy版本高的问题&#xff0c;我这里最终解决是python 3.10 numpy 1.22.0&#xff1b; pip install paddlepadd…

蔚来测试总监,让我们用这份《测试用例规范》,再也没加班过

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 固然&#xff0c;编写一份好的测试用例需要&#xff1a;充分的需求分析能力 理论及经验加持&#xff0c;作为测试职场摸爬打滚的老人&…

【计网】第二章 物理层

文章目录 物理层一、物理层的基本概念二、数据通信的基础知识2.1 数据通信系统的模型2.2 有关信道的基本概念2.3 信道的极限容量2.3.1 奈奎斯特定理2.3.1 香农定理2.3.2 信噪比 三、物理层下面的传输媒体3.1 导引型传输媒体3.2 非导引型传输媒体 四、信道复用技术4.1 频分复用 …

基于RGBD和惯性输入的实时室内场景重建

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 论文标题&#xff1a;《REAL-TIME INDOOR SCENE RECONSTRUCTION WITH RGBD AND INERTIA INPUT》 论文链接&#xff1a;https://arxiv.org/pdf/2008.00490.pdf 代码链接&#xff1a;https://github.com/CWa…

Spark01-Spark快速上手、运行模式、运行框架、核心概念

1 概述 Spark和Hadoop Hadoop HDFS(GFS:TheGoogleFileSystem)MapReduce总结&#xff1a;性能横向扩展变得容易&#xff0c;横向拓展:增加更多的计算节点来扩展系统的处理能力Hbase&#xff1a;分布式数据库 Spark Spark CoreSpark SQLSQL 方言&#xff08;HQL)Spark Streamin…

玩转注册表,这几个windowsAPI函数就够了

注册表的结构 注册表是一个数据库&#xff0c;它的结构同逻辑磁盘类似。注册表包含键(Key)&#xff0c;它类似磁盘中的目录&#xff0c;注册表还包含键值(Value)&#xff0c;它类似磁盘中的文件。一个键可以包含多个子健和键值&#xff0c;其中键值用于存储数据&#xff0c;顶…

陌陌聊天数据分析 (一)

陌陌聊天数据分析&#xff08;一&#xff09; 目标 基于Hadoop和Hive实现聊天数据统计分析&#xff0c;构建聊天数据分析报表 需求 统计今日总消息量统计今日每小时消息量&#xff0c;发送和接收用户数量统计今日各地区发送消息数据量统计今日发送消息和接收消息用户数统计…

vue移动端手把手教你封装一个可移动悬浮窗、可移动打开扇形悬浮按钮组件

目录 概要 功能设计 技术细节-API回顾 touchstart 事件 touchmove事件 完整的代码实现&#xff08;悬浮窗&#xff09; 运行效果 进阶封装——可移动扇形展开悬浮按钮 实现效果演示 需求分析 代码实现 概要 悬浮窗、悬浮按钮是项目中常见的一种交互设计&#xff0c;特别是在移…

Linux国产操作系统,UCA-系统工程师学习必备技能,文件管理和查找、内容查找、归档的再学习

复习和巩固Linux的基础操作&#xff0c;对文件管理和查找、内容查找、归档以及管道和输入输出重定向进行再学习。 目录 1.文件管理 1. 1.head命令 1.2. tail命令 1.3. more/less命令 1.4. wc 统计命令 1.5. sort 排序命令 1.6. uniq 去重命令 1.7. paste合并命令 2.文…

基于matlab对现代相控阵系统中常用的子阵列进行建模分析(附源码)

一、前言 本示例说明如何使用相控阵系统工具箱对现代相控阵系统中常用的子阵列进行建模并进行分析。 相控阵天线与传统碟形天线相比具有许多优势。相控阵天线的元件更容易制造;整个系统受组件故障的影响较小;最重要的是&#xff0c;可以向不同方向进行电子扫描。 但是&#xff…