C++ 共享内存相关的API

C++ 共享内存相关的API

    • 1.什么是共享内存
        • 1.共享内存的概念
        • 2.共享内存的原理
        • 3.共享内存使用注意点
    • 2.共享内存有关API的操作函数及示例
        • 1.新建共享内存-shmget
        • 2.连接共享内存到当前的地址空间-shnat
        • 3.当前进程分离共享内存shmdt
        • 4.控制共享内存-shmctl
        • 5.共享内存操作示例
    • 3.共享内存的使用场景有哪些

1.什么是共享内存

1.共享内存的概念

共享内存是一种操作系统提供的机制,用于实现多个进程之间共享数据的方式。在共享内存中,多个进程可以访问同一块物理内存区域,从而实现数据的共享和通信,而不需要进行显式的数据拷贝或进程间的消息传递。

2.共享内存的原理

共享内存的基本原理是将一块内存区域映射到多个进程的地址空间中,使得这些进程可以直接访问该内存区域。这种共享的内存区域被称为共享内存段。多个进程可以通过读写共享内存段来实现数据的共享和交互。

3.共享内存使用注意点

使用共享内存可以提高数据访问和传输的效率,因为数据直接存储在物理内存中,进程可以直接读写内存,而不需要进行数据的拷贝或消息的传递。然而,由于多个进程可以同时访问共享内存,因此需要采取适当的同步机制,如锁或信号量,来保证数据的一致性和避免竞态条件。

2.共享内存有关API的操作函数及示例

1.新建共享内存-shmget
int shmget (key_t __key, size_t __size, int __shmflg)

key:共享内存的键值,可以理解为共享内存的唯一性标记
size:共享内存的大小
shmflag:创建进程和其他进程的读写权限标识
返回值:响应的共享内存的标识符,失败返回-1

2.连接共享内存到当前的地址空间-shnat
void *shmat (int __shmid, const void *__shmaddr, int __shmflg)

shm_id:共享内存标识符
shm_addr:指定共享内存连接到当前进程的地址;通常为0,表示由系统来选择
shmflag:标志位
返回值:指向共享内存第一个字节的指针,失败返回-1

3.当前进程分离共享内存shmdt
 int shmdt (const void *__shmaddr)
4.控制共享内存-shmctl
int shmctl (int __shmid, int __cmd, struct shmid_ds *__buf) 

和信号量的semctl函数类似,控制共享内存
shm_id:共享内存标识符
command:有三个值:

IPC_STAT:获取共享内存的状态信息,包括共享内存的大小、创建时间、最后访问时间、进程ID等。IPC_SET:设置共享内存的状态信息,例如修改共享内存的权限、最后访问时间等。IPC_RMID:删除共享内存段,释放分配的内存资源。

需要注意的是,shmctl函数的第三个参数__buf是一个指向shmid_ds结构体的指针,用于传递共享内存的状态信息。在使用IPC_STAT命令时,__buf指向的结构体将被填充共享内存的状态信息。在使用IPC_SET命令时,__buf指向的结构体应该包含要设置的共享内存状态信息。在使用IPC_RMID命令时,__buf可以为NULL。

除了上述常用的命令,还有其他一些命令可供使用,例如:

IPC_INFO:获取系统中共享内存的状态信息,包括共享内存的总数、使用的共享内存段数量、共享内存的最大大小等。SHM_LOCK:锁定共享内存,阻止其被交换到磁盘上。SHM_UNLOCK:解锁共享内存,允许其被交换到磁盘上
5.共享内存操作示例
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>using namespace std;int main() {int shmId; // 共享内存ID号char *shmPtr; // 指向共享内存的指针key_t shmKey; // 创建共享内存的键值size_t shmSize; // 共享内存的大小shmKey = ftok(".", 'a'); // 获取用于创建共享内存的键值shmSize = getpagesize(); // 获取系统内存页的大小// 创建共享内存shmId = shmget(shmKey, shmSize, IPC_CREAT | 0666);if (shmId < 0) {cerr << "Error: shmget() failed" << endl;exit(1);}// 映射共享内存到进程的地址空间shmPtr = (char *) shmat(shmId, NULL, 0);if (shmPtr == (char *) -1) {cerr << "Error: shmat() failed" << endl;exit(1);}// 数据写入共享内存strcpy(shmPtr, "Hello, shared memory,this is first write data!");// 读取共享内存中的数据cout << "Shared memory content first read:\n " << shmPtr << endl;//重新写入共享内存strcpy(shmPtr, "Hello, shared memory,this is second write data!");// 读取共享内存中的数据cout << "Shared memory content again:\n\n" << shmPtr << endl;//获取系统中共享内存的状态信息struct shminfo  shm_info;shmctl(shmId, IPC_INFO, (struct shmid_ds*)&shm_info);cout << "共享内存总数: " << shm_info.shmmni << endl;cout << "已使用的共享内存段数量: " << shm_info.shmseg << endl;cout << "共享内存的最大大小: " << shm_info.shmmax << endl;// 分离共享内存if (shmdt(shmPtr) < 0) {cerr << "Error: shmdt() failed" << endl;exit(1);}// 删除共享内存if (shmctl(shmId, IPC_RMID, NULL) < 0) {cerr << "Error: shmctl() failed" << endl;exit(1);}return 0;
}

在这里插入图片描述

3.共享内存的使用场景有哪些

共享内存是多个进程之间共享数据的一种方式,主要有以下场景:

进程间通信:多个进程之间需要共享一些数据或对象,例如操作系统为进程间的通信提供的缓冲区就是使用共享内存实现的。

高性能计算:在高性能计算中,多个进程需要访问共享的数据结构,例如矩阵运算等,使用共享内存可以避免数据拷贝和通信的开销,提高程序性能。

大型数据库:大型数据库需要频繁地进行数据访问和更新,使用共享内存可以提高数据访问效率,缩短数据读写时间。

多进程服务器:多进程服务器需要共享一些全局数据,例如监听端口号、连接池、缓冲区等。

总之,共享内存是在多个进程之间共享数据的重要方式之一。在需要大量数据传输和频繁访问数据的场景中,使用共享内存可以提高程序效率和性能。但是,需要注意使用锁或者其他同步机制来保证数据的一致性和可靠性。

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

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

相关文章

Node2Vec实战---《悲惨世界》人物图嵌入

1. pip各个包后导入 import networkx as nx # 图数据挖掘 import numpy as np # 数据分析 import random # 随机数# 数据可视化 import matplotlib.pyplot as plt %matplotlib inline plt.rcParams[font.sans-serif][SimHei] # 用来正常显示中文标签 plt.rcParams[axes.uni…

定制SQLmap和WAF绕过

1. SQLmap tamper 脚本编写 以sqli-lab第26关为例 输入?id1’ --&#xff0c;报错字符型注入 考虑闭合问题&#xff0c;输入?id1’ and 1&#xff0c;但是回显中and和空格消失了&#xff0c;可知and和空格被过滤了 因为and和or被过滤考虑使用双写绕过手段&#xff0c;空格使…

Linux常用命令—find命令大全

文章目录 一、find命令常用功能1、find命令的基本信息如下。2、按照文件名搜索3、按照文件大小搜索4、按照修改时间搜索5、按照权限搜索举例&#xff1a;6、按照所有者和所属组搜索7、按照文件类型搜索8、逻辑运算符 一、find命令常用功能 1、find命令的基本信息如下。 命令名…

java:java.util.MissingResourceException: Cant find bundle for base name解决方式

java&#xff1a;java.util.MissingResourceException: Cant find bundle for base name解决方式 1 前言 代码执行如下&#xff1a; ResourceBundle.getBundle("res.Message",Locale.getDefault(), ReadMyProps.class.getClassLoader());或 ResourceBundle.getBu…

(25)(25.1) 光学流量传感器的测试和设置

文章目录 25.1.1 测试传感器 25.1.2 校准传感器 25.1.3 测距传感器检查 25.1.4 预解锁检查 25.1.5 首次飞行 25.1.6 第二次飞行 25.1.7 正常操作设置 25.1.8 视频示例&#xff08;Copter-3.4&#xff09; 25.1.9 空中校准 25.1.1 测试传感器 将传感器连接至自动驾驶仪…

ROS2 从头开始:第 8 部分 - 使用 ROS2 生命周期节点简化机器人软件组件管理

一、说明 欢迎来到我在 ROS2 上的系列的第八部分。对于那些可能不熟悉该系列的人&#xff0c;我已经涵盖了一系列主题&#xff0c;包括 ROS2 简介、如何创建发布者和订阅者、自定义消息和服务创建、组合和执行器以及 DDS 和 QoS 配置。如果您还没有机会查看以前的帖子&#xff…

2023华为杯数学建模D题第三问——区域双碳目标情景设计样例

在第二问建立好预测模型的基础上&#xff0c;如何设计第三问所说的区域双碳路径&#xff0c;以对宏观政策进行指导&#xff01; 采用STIRPA的基本模型对中国碳达峰时间进行预测&#xff0c;对该模型公式两边取对数得到&#xff1a; 其中&#xff1a;P为人口&#xff0c;A为GDP…

异常记录-VS

1.文件加载失败 无法找到指定路径 Frame GUID: a6c744a8-0e4a-4fc6- 886a-064283054674 Frame mode: VSFM_ MdiChild Error code: 0x80131515 未理会这个提示&#xff0c;可以打开运行项目&#xff0c;只是会跳出这个弹窗。 无法关闭这个异常的窗口。

十四、MySql的用户管理

文章目录 一、用户管理二、用户&#xff08;一&#xff09;用户信息&#xff08;二&#xff09;创建用户1.语法&#xff1a;2.案例&#xff1a; &#xff08;三&#xff09; 删除用户1.语法&#xff1a;2.示例&#xff1a; &#xff08;四&#xff09;修改用户密码1.语法&#…

【MT7628AN】IOT | MT7628AN OpenWRT开发与学习

IOT | MT7628AN OpenWRT开发与学习 时间:2023-06-21 文章目录 `IOT` | `MT7628AN` `OpenWRT`[开发与学习](https://blog.csdn.net/I_feige/article/details/132911634?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22132911634…

【C语言】指针的进阶(四)—— 企业笔试题解析

笔试题1&#xff1a; int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } 【答案】在x86环境下运行 【解析】 &a是取出整个数组的地址&#xff0c;&a就表示整个数组&#xff0c;因此…

vue项目打包优化

首先第一步通过浏览器看首次加载的问题大小&#xff0c;时间跨度等方面入手 1. Coverage观察 Coverage是chrome开发者工具的一个新功能&#xff0c;从字面意思上可以知道它是可以用来检测代码在网站运行时有哪些js和css是已经在运行&#xff0c;而哪些js和css是还没有用到的&a…

WEB使用VUE3实现地图导航跳转

我们在用手机查看网页时可以通过传入经纬度去设置目的地然后跳转到对应的地图导航软件&#xff0c;如果没有下载软件则会跳转到下载界面 注意&#xff1a; 高德地图是一定会跳转到一个新网页然后去询问用户是否需要打开软件百度和腾讯地图是直接调用软件的这个方法有缺陷&…

【c#-Nuget 包“在此源中不可用”】 Nuget package “Not available in this source“

标题c#-Nuget 包“在此源中不可用”…但 VS 仍然知道它吗&#xff1f; (c# - Nuget package “Not available in this source”… but VS still knows about it?) 背景&#xff1a; 今日从公司svn 上拉取很久很久以前的代码&#xff0c;拉取下来200报错&#xff0c;进一步发…

【机器学习】文本多分类

声明&#xff1a;这只是浅显的一个小试验&#xff0c;且借助了AI。使用的是jupyter notebook,所以代码是一块一块&#xff0c;从上往下执行的 知识点&#xff1a;正则删除除数字和字母外的所有字符、高频词云、混淆矩阵 参考&#xff1a;使用python和sklearn的中文文本多分类…

资源分享 | 情绪脑电研究公开数据集

SEED SEED数据集是由上海交大类脑计算与机器智能研究中心(BCMI)开发的。该数据集是基于脑电的情绪分类任务而设计的数据集。该数据集记录了15名被试在观看积极、中性和消极情绪电影片段时的EEG信号&#xff0c;每个视频片段的时间为3-5分钟。每个参与者重复采集三天&#xff0…

多分类中混淆矩阵的TP,TN,FN,FP计算

关于混淆矩阵&#xff0c;各位可以在这里了解&#xff1a;混淆矩阵细致理解_夏天是冰红茶的博客-CSDN博客 上一篇中我们了解了混淆矩阵&#xff0c;并且进行了类定义&#xff0c;那么在这一节中我们将要对其进行扩展&#xff0c;在多分类中&#xff0c;如何去计算TP&#xff0…

IDEA中创建Java Web项目方法1

以下过程使用IntelliJ IDEA 2021.3 一、File-> New -> Project... 1. 项目类型中选择 Java Enterprise 项目 2. Name&#xff1a;填写自己的项目名称 3. Project template&#xff1a;选择项目的模板&#xff0c;Web application。支持JSP和Servlet的项目 4. Applica…

Nginx location 精准匹配URL = /

Location是什么&#xff1f; Location是Nginx中的块级指令(block directive)&#xff0c;通过配置Location指令块&#xff0c;可以决定客户端发过来的请求URI如何处理&#xff08;是映射到本地文件还是转发出去&#xff09;及被哪个location处理。 匹配模式 分为两种模式&…

位段 联合体 枚举

Hello好久不见&#xff0c;今天分享的是接上次结构体没有分享完的内容&#xff0c;这次我们讲讲位段 枚举和联合体的概念以及他们的用法。 2.1 什么是位段 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 1.位段的成员必须是 int、unsigned int 或signed int 。 …