5

如果我想在'd 进程char **keys之间共享类似数组的东西,我可以将指针粘贴到共享内存段中还是必须将所有数据复制到共享内存段中?fork()shm_openmmapkeyskeys

4

1 回答 1

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 返回什么,它都可以工作。

于 2013-10-06T18:40:35.870 回答