Linux多进程通信(3)——详细说说共享内存原理及使用例程

1.共享内存原理及优缺点

共享内存的原理便是将相同的一片物理内存映射到进程A和进程B不同的逻辑地址空间,两个进程同时访问这块物理内存(共享内存)。

1)优点
共享内存是进程间通信访问速度最快。
例如消息队列,FIFO,管道的消息传递方式一般为
1:服务器得到输入
2:通过管道,消息队列写入数据,通常需要从进程拷贝到内核。
3:客户从内核拷贝到进程
4:然后再从进程中拷贝到输出文件
上述过程通常要经过4次拷贝,才能完成文件的传递。
共享内存只需要两次拷贝
1:从输入文件到共享内存区
2:从共享内存区输出到文件
上述过程减少了数据不必要的拷贝,以及用户态和内核态之间的切换,所以花的时间较少,和访问进程独有的内存区域一样快

2)缺点
共享内存是进程间不安全的,需要使用额外的同步进制来控制对共享内存的访问,常用的是信号量。

2.查看系统共享内存

ipcs -m    //查看系统的共享内存
ipcrm -m [shmid] //删除指定共享内存段

image.png

3.函数API

1)获取共享内存

int shmget(key_t key, size_t size, int shmflg);

key:ftok生成的key标识,在系统中是唯一的
size:共享内存大小(系统申请内存的最小单位是页,一页是4K字节,为了避免大量的碎片,申请内存大小一般是页的整数倍),为0代表只是获取已经创建好的共享内存
shmflag:和信号量等相同,IPC_CREAT | IPC_EXCL则代表不存在则创建,存在则返回失败,0代表获取共享内存标识符,若不存在则函数会报错。

2)映射共享内存

 void *shmat(int shmid, const void *shmaddr, int shmflg);

shmid: 共享内存ID
shmaddr: 起始虚拟地址空间,NULL则是由系统自动分配
shmflag:一般为0,可以给SHM_RDONLY为只读模式,其他的为读写
返回值:成功返回虚拟地址,出错返回-1
fork后子进程继承已连接的共享内存地址。exec后该子进程与已连接的共享内存地址自动断开映射。进程结束后,连接的共享内存也会断开映射。

必须所有映射到共享内存的进程都断开映射,才会删除这片共享内存!

3)断开共享内存映射

int shmdt(const void *shmaddr);

shmdt: 断开共享内存映射(断开不代表删除共享内存,只是断开映射的线路)
shmaddr:共享内存地址

4)控制共享内存

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

shmid: 共享内存ID
cmd:执行的具体操作
IPC_RMID:表示可以删除共享内存
IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中
IPC_SET:改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内
buf:共享内存管理的结构体
必须所有映射到共享内存的进程都断开映射,才会删除这片共享内存!

4.例程

1)write端代码

#include "apue.h"
#include <sys/ipc.h>
#include <sys/shm.h>
//write hello world 
//another program read this msg

int main(int argc, char **argv)
{
    //1.根据文件和id获取key
    key_t key;
    key = ftok(".", 2);

    //2.根据key创建共享存储区
    int shmid = 0;
    shmid = shmget(key, 1024, IPC_CREAT|IPC_EXCL|0666);
    if (shmid == -1) {
        perror("shmget error");
        return -1;
    }

    //3.连接共享存储区和进程地址空间
    char *shmaddr = NULL;
    shmaddr = shmat(shmid, 0, 0);
    if (shmaddr == (char *)-1) {
        perror("shmat error");
        return -1;
    }

    //4.写入数据
    strcpy(shmaddr, "hello world");

    sleep(5);

    //5. 断开共享存储连接
    shmdt(shmaddr);
    //6. 删除共享存储区
    shmctl(shmid, IPC_RMID, NULL);

    printf("success write!!\n");
    return 0;
}

2)read端代码

#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
//write hello world 
//another program read this msg

int main(int argc, char **argv)
{
    //1.根据文件和id获取key
    key_t key;
    key = ftok(".", 2);

    //2.根据key创建共享存储区
    int shmid = 0;
    shmid = shmget(key, 0, 0);
    if (shmid == -1) {
        perror("shmget error");
        return -1;
    }

    //3.连接共享存储区和进程地址空间
    char *shmaddr = NULL;
    shmaddr = shmat(shmid, 0, 0);
    if (shmaddr == (char *)-1) {
        perror("shmat error");
        return -1;
    }

    printf("read data is %s \n", shmaddr);

    //5. 断开共享存储连接
    shmdt(shmaddr);

    printf("success read!!\n");
    return 0;
}

gcc编译后测试效果如下~,当然这只是一个简单的demo,正常我们使用的话,一定要用信号量等手段,进行共享内存的保护

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

喜尔康众多智慧酒店解决方案亮相上海酒店展,“十档妇洗”技术惊艳全馆

日前&#xff0c;2024上海国际酒店及商业空间博览会在上海新国际博览中心盛大举行&#xff0c;2000品牌同时亮相&#xff0c;引发行业广泛关注。 作为行业领先的智能家居企业&#xff0c;喜尔康30年来专注于为大家居行业提供智能化解决方案&#xff0c;此次参展展出了超静音智能…

ssm校园订餐系统

ssm校园订餐系统 一、项目简介 本项目是一套基于SSM实现的网上订餐系统 或 在线点餐系统 或 外卖点餐系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 详细介绍了网上订餐系统的实现&#xff0c;包括&#xff1a; 1.项目介绍 2.环境…

突破编程_前端_JS编程实例(分割窗体组件)

1 开发目标 分隔窗体组件旨在提供灵活的窗体分隔功能&#xff0c;支持横向分割与纵向分隔两种类型&#xff0c;并具备拖拽调整窗体比例的功能&#xff0c;同时提供最小比例设置&#xff0c;以防止窗体被过度缩小&#xff1a; 2 详细需求 2.1 分隔窗体类型 &#xff08;1&…

Ant Design Vue中的table与pagination的联合使用

效果&#xff1a; 代码&#xff1a; <a-table:dataSource"dataSource":columns"columns":pagination"pagination"change"handleTableChange":scroll"{ x: 100%, y: 600 }"> </a-table> export default defin…

零基础入门实战深度学习Pytorch课程下载

本课程旨在帮助零基础学员掌握PyTorch深度学习框架。通过实战项目&#xff0c;学员将学习神经网络基础、模型训练和调优技巧。逐步掌握深度学习核心概念&#xff0c;为未来在人工智能领域打下坚实基础。 课程大小:2.6G 课程下载&#xff1a;https://download.csdn.net/downlo…

网络安全 | 什么是云安全?

关注WX&#xff1a;CodingTechWork 云安全-介绍 云安全是为了解决企业安全所面临的外部和内部威胁&#xff0c;它是一组程序和技术的集合。企业在实施其数字化转型策略&#xff0c;并将各种云端工具和服务纳入企业基础架构中时&#xff0c;需要云安全保障业务顺利进行。 云计…

CentOS7.9排查网络带宽高占用的情况

//显示全部网卡 ifconfig //安装iftop yum install iftop -y //设定监测的网卡 iftop -i eth0 按 P 显示 host 信息及端口信息。 按 D 切换是否显示远端目标主机的端口信息。

15 - grace序列处理 - 十三点滑动平均法

grace序列处理 -十三点滑动平均法 滑动平均是一种常用的平滑数据的方法,可以用于去除噪声或者提取趋势。十三点滑动平均是指使用窗口大小为13的滑动平均,应用于GRACE序列处理中可以去除周年项的影响。 十三点滑动平均的计算公式为: y [ n ] = ( x [ n − 6 ]

C++ | Leetcode C++题解之第6题Z字形变换

题目&#xff1a; 题解&#xff1a; class Solution { public:string convert(string s, int numRows) {int n s.length(), r numRows;if (r 1 || r > n) {return s;}string ans;int t r * 2 - 2;for (int i 0; i < r; i) { // 枚举矩阵的行for (int j 0; j i &l…

ARM64架构栈帧以及帧指针FP

文章目录 前言一、arm64架构寄存器简介1.1 异常等级1.2 通用寄存器1.3 ARM64架构ABI 二、ARM64架构函数调用标准2.1 AArch64过程调用标准简介2.2 通用寄存器中的参数 三、demo分析3.1 main函数3.2 funb3.3 funa 四、栈帧总结五、demo演示参考资料 前言 这篇文章描述了 x86_64架…

Linux之实现Apache服务器监控、数据库定时备份及通过使用Shell脚本发送邮件

目录 一、Apache服务器监控 为什么要用到服务监控&#xff1f; 实现Apache服务器监控 二、数据库备份 为什么要用到数据库备份&#xff1f; 实现数据库备份 三、Shell脚本发送邮件 为什么要用使用Shell脚本发送邮件&#xff1f; 实现Shell脚本发送邮件 一、Apache服务器…

Mysql故障解析

目录 一、Mysql单实例故障排查 1.故障一 2.故障二 3.故障三 4.故障四 5.故障五 6.故障六 7.故障七 8.故障八 二、Mysql主从故障排查 1.故障一 2.故障二 3.故障三 三、Mysql优化 1.硬件方面 &#xff08;1&#xff09;关于CPU &#xff08;2&#xff09;关于内…

【技巧】如何解除Excel“打开密码”?

给Excel表格设置“打开密码”&#xff0c;可以保护表格不被他人随意打开&#xff0c;那如果后续不需要保护了&#xff0c;不想每次打开Excel都需要输密码&#xff0c;要怎么去除“打开密码”呢&#xff1f; 今天分享3个方法&#xff0c;最后一个方法记得收藏起来&#xff0c;以…

GWO-CNN-BiLSTM多输入时序预测|灰狼群算法优化的卷积-双向长短期神经网络|Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&…

ssm013小型企业办公自动化系统的设计和开发+vue

小型企业办公自动化系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对小型企业办公信息管理混乱&am…

需要本地后端的真机调试-微信

打开和修改IP改为电脑与手机同一局域网的 不知道这个要不要

GS1-全球分类标准

GS1 GS1是一个中立的全球合作平台&#xff0c;汇集行业领袖、政府、监管机构、学术界和协会&#xff0c;共同开发基于标准的解决方案&#xff0c;以应对数据交换的挑战。我们的规模和影响力——遍布 116 个国家/地区的当地会员组织、超过 200 万家用户公司和每天 100 亿笔交易—…

量化交易入门(三十八)CCI指标Python实现和回测

今天我们先单纯用CCI指标来完成策略的编写&#xff0c;后续我们会改进这个策略&#xff0c;将CCI指标和前面讲到的MACD和RSI相结合来优化&#xff0c;看看我们优化后的效果会不会更好。 一、量化策略 CCI指标在量化交易中的策略&#xff1a; 在以下情况下生成买入信号&#…

easy connect 连接不上网络,本地环境出现异常

环境&#xff1a; Win7 专业版 easy connect 问题描述&#xff1a; easy connect 连接不上网络&#xff0c;本地环境出现异常 解决方案&#xff1a; 1.打开IE的lnternet选项–高级 看看是否勾选了SSL 3.0 TLS1.0&#xff0c;取消&#xff08;未解决&#xff09; 2.请先关…

【工具-MATLAB】

MATLAB ■ MATLAB-简介■ MATLAB-应用领域■ MATLAB■ MATLAB■ MATLAB■ MATLAB ■ MATLAB-简介 MATLAB是matrix&laboratory两个词的组合&#xff0c;意为矩阵工厂&#xff08;矩阵实验室&#xff09; 美国MathWorks公司出品的商业数学软件, MATLAB和Mathematica、Maple并…