问题
其他进程可以访问结构体中的指针数据 指针数据也正确 但是指针指向的 数组数据的指针可以读取
数据无法进行读取 读取就出现段错误
分析
可以看出,进程实际上是将共享内存映射到进程所属的地址空间内!这样就产生了一个问题:你在一个进程中将共享内存的一个变量的地址赋给共享内存的一个指针的话,实际保存的是进程虚拟内存空间的地址,不同进程保存的地址可能不同,这样是行不通的!
思路:不管进程是哪一个 但是分配的内存空间大小是一样的(即偏移量是一样的),只要知道进程中映射的首地址,可以通过偏移量来得到其他数据的地址,查找地址指向的数值。
代码头文件
#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 =