看板Programming
标 题Re: [问题] Linux下的共享记忆体配置二维阵列
发信站SayYA 资讯站 (Fri Oct 20 04:09:35 2006)
转信站ptt!ctu-reader!news.nctu!SayYa
※ 引述《[email protected] (破破茶杯)》之铭言:
> 谢谢您的回应. 我指的是 int** 这样的配置方式.
> 阵列的大小在 run-time 的时候才能得知
> 问题在於要怎麽在 share memory 里头进行存取
好像有点自找麻烦?
老实说不大清楚你这样搞二维 shm 的实际用途意义为何,因为就算是
二维的,那您实际上要怎样使用? 因为 shm 二维与一般 malloc() 配置
来的二维使用方式是完全不大一样。
一般传统方式:
/* p[10][100]; */
int **p;
int i;
p = (int **) malloc(sizeof(int *) * 10;
for(i=0;i<10;i++)
p[i] = malloc(sizeof(int) * 100);
至於你说的 shm 方式,一样作法方式:
----------------------------------------------------------------
shmput:
key_t key;
int shmid;
int **p;
int i;
char buf[10];
key = ftok("/dev/null", 'A');
shmid = shmget(key, sizeof(int *) * 10, 0644 | IPC_CREAT);
p = (int **) shmat(shmid, (void *)0, 0);
for(i=0;i<10;i++) {
key = ftok("/dev/null", 'A'+i+1);
shmid = shmget(key, sizeof(int) * 100, 0644 | IPC_CREAT);
p[i] = (int *) shmat(shmid, (void *)0, 0);
}
for(i=0;i<10;i++) {
sprintf(buf,"hello world(%d)",i);
strcpy((char *)p[i],buf);
shmdt(p[i]);
}
----------------------------------------------------------------
shmget:
key_t key;
int shmid;
int **p;
int i;
char buf[10];
key = ftok("/dev/null", 'A');
shmid = shmget(key, 0, 0644 | IPC_CREAT);
p = (int **) shmat(shmid, (void *)0, 0);
for(i=0;i<10;i++) {
key = ftok("/dev/null", 'A'+i+1);
shmid = shmget(key, 0, 0644 | IPC_CREAT);
p[i] = (int *) shmat(shmid, (void *)0, 0);
}
for(i=0;i<10;i++) {
printf("item %d, msg: %s\n",i,p[i]);
shmdt(p[i]);
}
片段 code 提供给你参考。
至於 shm 有多大有多少笔资料,shmctl() 可以提供给你答案。
--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
现代人普遍的现象: 「小学而大遗」、「舍本而逐末」
「以偏而概全」、「因噎而废食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: SayYA 资讯站 <bbs.sayya.org>
◆ From: kendlee.sayya.org