在多个分叉进程之间共享指针

时间:2013-10-05 17:59:27

标签: pointers process fork share shared-memory

如果我想使用char **keysfork()shm_open个进程之间共享mmap数组之类的内容,我可以直接指向keys进入共享内存段或是否必须将keys中的所有数据复制到共享内存段?

1 个答案:

答案 0 :(得分: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返回什么,它都能正常工作。