共享内存C(Linux)

news/2024/11/11 0:56:12/

在学习的时候遇到问题,就是将结构体作为共享内存时将string类型置入结构体内,导致程序出现段错误,后来经过排查发现共享内存是c语言的库不支持string类型,需要用char name[20]代替。

1.在Linux中如何查看共享内存

(1)使用ipcs -m命令查看当前系统中的共享内存段

(2)找到需要释放的共享内存的标识符(shmid),然后使用ipcrm -m shmid命令来释放它

2.如何使用共享内存

在Linux系统中,共享内存是一种高效的进程间通信(IPC)方式,它允许多个进程访问同一块物理内存区域,从而实现数据的快速共享和传输。

  1. ftok():生成一个唯一的键值(key),用于标识共享内存段。这个函数通常结合文件路径和项目ID(proj_id)来计算键值。

  2. shmget():根据键值创建或获取共享内存段。函数原型为int shmget(key_t key, size_t size, int shmflg);。其中,keyftok()生成的键值,size是共享内存段的大小,shmflg是控制选项,如IPC_CREAT(创建共享内存段)和IPC_EXCL(与IPC_CREAT一起使用时,如果共享内存已存在则失败)。

  3. shmat():将共享内存段连接到当前进程的地址空间。函数原型为void *shmat(int shmid, const void *shmaddr, int shmflg);。其中,shmidshmget()返回的共享内存标识符,shmaddr是建议连接的地址(通常传入NULL让系统自动选择),shmflg是控制选项,如SHM_RDONLY(以只读方式连接)。

  4. shmdt():断开共享内存段与当前进程的连接。函数原型为int shmdt(const void *shmaddr);。其中,shmaddrshmat()返回的共享内存地址。

  5. shmctl():控制共享内存段,如删除共享内存段等。函数原型为int shmctl(int shmid, int cmd, struct shmid_ds *buf);。其中,shmid是共享内存标识符,cmd是控制命令(如IPC_RMID用于删除共享内存段),buf是指向shmid_ds结构的指针,用于传递控制信息。

具体代码:

    //共享内存的指针struct my_map *ptr;int *ptriter;//创建共享内存//将内存分离出来int shmid=shmget((key_t)0x5005,sizeof(struct my_map)*20,0640|IPC_CREAT);int shmiter=shmget((key_t)0x1001,4,0640|IPC_CREAT);	if(shmid==-1){cout<<"结构体共享内存创建失败"<<"\n\n";return 0;}if(shmiter==-1){cout<<"共享内存iter创建失败\n\n";}//给每个进程创建指针指向这个共享内存ptr=(struct my_map*)shmat(shmid,NULL,0);ptriter=(int*)shmat(shmiter,NULL,0);

 


http://www.ppmy.cn/news/1528196.html

相关文章

C语言习题~day32

请问该程序的输出是多少&#xff08;&#xff09; #include<stdio.h> int main(){ unsigned char i 7; int j 0; for(;i > 0;i - 3){ j; } printf("%d\n", j); return 0; }A.2 B.死循环 C.173 D.172 无符号字符型的取值范围是 0 到 255。 第一次循环…

react 创建react项目

使用react的环境&#xff1a; 下载nodejs,然后全局安装create-react-app 1、检查是否安装&#xff1a; create-react-app --version 2、全局安装create-react-app npm install create-react-app -g 3、创建react项目 注意&#xff1a;项目第一次安装&#xff0c;可能会直…

光伏发电量估算有多重要?如何分析?

光伏发电量的准确估算不仅是项目规划、投资决策的关键依据&#xff0c;也是后续运维管理、效益评估的基础。 一、光伏发电量估算的重要性 1、项目规划与投资决策&#xff1a;准确的发电量预测能够帮助投资者评估项目的经济可行性&#xff0c;包括投资回报率、成本回收期等关键…

C++--类的实例化

一、实例化的概念 用类类型在屋里内存中创建对象的过程&#xff0c;称为类实例化出对象 类是对对象进行一种抽象描述&#xff0c;是一个模型一样的东西&#xff0c;限定了类有哪些成员变量&#xff0c;这些成员变量只是声明&#xff0c;没有分配空间&#xff0c;用类实例化出…

【Redis入门到精通三】Redis核心数据类型(List,Set)详解

目录 Redis数据类型 ​编辑 1.List类型 &#xff08;1&#xff09;常见命令 &#xff08;2&#xff09;内部编码 2.Set类型 &#xff08;1&#xff09;常见命令 &#xff08;2&#xff09;内部编码 Redis数据类型 查阅Redis官方文档可知&#xff0c;Redis提供给用户的核…

do while循环练习

本篇章&#xff0c;咱们就来看看我做关于do while的题目&#xff0c;希望可以给有需要的小伙伴们带来灵感。 1.练习&#xff1a; 题目&#xff1a;输入一个正整数&#xff0c;计算这个整数是几位。 例如&#xff1a;输入&#xff1a;1234&#xff0c;输出&#xff1a;4 输出…

深度学习-物体检测SSD

一&#xff1a;SSD结构 以VGG-16为基础&#xff0c;使用VGG的前五个卷积&#xff0c;后面增加从CONV6开始的5个卷积结构&#xff0c;输入图片要求300*300 1. 分别将VGG16的全连接层FC6和FC7转换成3x3的卷积层Conv6和1x1的卷积层Conv7 2.去掉所有的Dropout层和FC8层 3.同时将…

Linux文件IO(二)-文件操作使用详解

前篇已经讲过open打开文件的操作使用&#xff0c;本篇文章介绍剩余的wirte、read、close、lseek等操作。 1.write写文件 调用 write 函数可向打开的文件写入数据&#xff0c;其函数原型如下所示&#xff08;可通过"man 2 write"查看&#xff09;&#xff1a; #inc…