Discussion:
[問題] Linux下的共享記憶體配置二維陣列
(时间太久无法回复)
小州
2006-10-19 09:58:18 UTC
Permalink
在Linux下使用C++撰寫IPC的程式
可以透過 shmat函式的 void* 指標來存取一維陣列
可是我想在這個共享記憶體裡頭
擺放動態的二維陣列, 並能夠存取
請問應該如何做到呢
謝謝 !
有個建議方式,把一維陣列當作二維來使用,這個建議如何呢 ?

比方你配置 int[100], 可以看成 int [5][20]。

不過若是你說的是 int ** 的話,可能就不是如此簡單。

--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而概全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: kendlee.sayya.org
小州
2006-10-19 20:09:35 UTC
Permalink
謝謝您的回應. 我指的是 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

Loading...