如果我想使用char **keys
和fork()
在shm_open
个进程之间共享mmap
数组之类的内容,我可以直接指向keys
进入共享内存段或是否必须将keys
中的所有数据复制到共享内存段?
答案 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返回什么,它都能正常工作。