2013-10-05 91 views
5
之間

如果我想用shm_openmmap我只能堅持一個指針共享類似fork()「d流程之間的char **keys陣列keys到共享內存段或我複製所有數據在keys中進入共享內存段?共享指針多個派生進程

回答

5

要共享的所有數據必須位於共享段中。這意味着指針和字符串必須位於共享內存中。

分享包含指針的內容可能很麻煩。這是因爲mmap不能保證給定的映射將以所需的地址結束。

你仍然可以通過兩種方法做到這一點。首先,你可以用mmap試試你的運氣,並希望動態鏈接器不會在你的首選地址加載一些東西。

第二種方法是使用相對指針。在指針內部,不是存儲指向字符串的指針,而是存儲指針地址和字符串地址之間的差異。像這樣:

char **keys= mmap(NULL, ...); 
char *keydata= (char*) keys + npointers * sizeof(char*); 
strcpy(keydata, firstring); 
keys[0]= (char*) (keydata - (char*) &keys[0]); 
keydata+= strlen(firststring)+1; 

當你想從其它進程訪問字符串,你做相反的:

char **keys= mmap(NULL, ...); 
char *str= (char*) (&keys[0]) + (ptrdiff_t) keys[0]; 

這是一個有點麻煩,但它的工作原理是什麼MMAP回報無關。