2013-10-05 77 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回报无关。