日期:2014-05-16  浏览次数:20667 次

linux 下申请system v共享内存区存放结构体等复杂数据
对system v共享内存区的使用有几点疑问,想请高手解决下:
    我申请了多倍于结构体大小的共享内存空间,然后往里面存放结构体信息,不知这样做会不会引起内存溢出的问题,或者有什么不妥?代码如下:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <errno.h>

extern int errno;

typedef struct struTest{
char lstr1[64];
int ii;
char lstr2[126];
}Test, *PTest;

int main(int c, char** v)
{
PTest pt;
int myshmid1 = shmget(0x1234, 3*sizeof(Test), IPC_CREAT|0660);
if(myshmid1==-1)
{
printf("shm1 get err %d\n", errno);
return 0;
}
printf("size test:%d\n", sizeof(Test));

pt = (PTest)shmat(myshmid1, NULL, 0);
for(int i=0;i<3;i++)
{
memset(pt+i, 0, sizeof(Test));
strcpy((pt+i)->lstr1, "aabbcc");
(pt+i)->ii = i+1;
}

int* pishm;
int myshmid2 = shmget(0x1235, sizeof(int), IPC_CREAT|0660);
pishm = (int*)shmat(myshmid2, NULL, 0);

printf("begin test...\n");
for(int i=0;i<3;i++)
{
printf("ptest%d-lstr1:%s, ii:%d\n", i, (pt+i)->lstr1, (pt+i)->ii);
}

int res = shmdt(pt);
printf("dt pt res:%d, errno:%d\n", res, errno);
res = shmdt(pishm);
printf("dt int res:%d, errno:%d\n", res, errno);
printf("end test...\n");
return 0;
}

程序运行的结果是正确的,这是不是就说明这样做是可以的,另外为共享内存区分配的空间是连续的吗?
Linux shm system?v

------解决方案--------------------
可以的, 注意结构体内的指针概念换成字节偏移量就可以, 这里没有指针的问题,