linux共享内存实现指针功能

linux共享内存实现指针功能

问题

其他进程可以访问结构体中的指针数据 指针数据也正确 但是指针指向的 数组数据的指针可以读取
数据无法进行读取 读取就出现段错误

分析

在这里插入图片描述
可以看出,进程实际上是将共享内存映射到进程所属的地址空间内!这样就产生了一个问题:你在一个进程中将共享内存的一个变量的地址赋给共享内存的一个指针的话,实际保存的是进程虚拟内存空间的地址,不同进程保存的地址可能不同,这样是行不通的!

思路:不管进程是哪一个 但是分配的内存空间大小是一样的(即偏移量是一样的),只要知道进程中映射的首地址,可以通过偏移量来得到其他数据的地址,查找地址指向的数值。

代码头文件


#ifndef _QUEUE_H_
#define _QUEUE_H_

#define WRQUE_KEY 1236
#define RDQUE_KEY 1238

//注释表示 2进程通信 不注释表示2线程通信
//#define DOUBLE_PTH

typedef struct _Queue_
{
     
	unsigned int wridx;		/* 写指针 */
	unsigned int rdidx;		/* 读指针 */
	unsigned int datasize;	/* 数据长度 */
	unsigned int res;	/* 数据长度 */
    char *data ;	/* 数据区 */
}Queue;

typedef enum _QUEUE_NUM_ //enum 枚举类型 0 1 2
{
   
	WR_QUEUE = 0,
	RD_QUEUE = 1,
	QUEUE_NUM,
}_QUEUE_;

extern int QUEUE_Init(int depth,int size,int shm_key, Queue **pQue);//队列初始化
extern Queue* QUEUE_Get(int shm_key,int size);//队列获取
extern int QUEUE_Reset( Queue *pQue);//队列重置
extern int QUEUE_Write( Queue *pQue,int wrlen,char *data);//队列写操作
extern int QUEUE_Read( Queue *pQue,int rdlen,char *data);//队列读操作
#endif

封装函数

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
#include <time.h>
#include "queue.h"



/* 队列初始化 */
int QUEUE_Init(int depth,int size,int shm_key, Queue **pQue)
{
   
	int shmid = 0;
	int shmid_data =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值