linux 下申请system v共享内存区存放结构体等复杂数据

Ronux 2013-05-22 02:29:21
对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;
}

程序运行的结果是正确的,这是不是就说明这样做是可以的,另外为共享内存区分配的空间是连续的吗?
...全文
224 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ronux 2013-05-22
  • 打赏
  • 举报
回复
引用 1 楼 qq120848369 的回复:
可以的, 注意结构体内的指针概念换成字节偏移量就可以, 这里没有指针的问题,
阁下的意思是就应该这样strcpy((pt+i)->lstr1, "aabbcc");取值或赋值吗,那么阁下所说的“这里没有指针的问题”是什么意思呢,请原谅我的愚钝 也欢迎大家多多发言,讨论关于system v 共享内存的问题
qq120848369 2013-05-22
  • 打赏
  • 举报
回复
可以的, 注意结构体内的指针概念换成字节偏移量就可以, 这里没有指针的问题,

18,772

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧