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

use*_*798 5 share pointers fork process shared-memory

如果我想char **keysfork()'d进程之间共享类似数组的东西shm_open,mmap我可以将指针指向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;
Run Code Online (Sandbox Code Playgroud)

如果要从其他进程访问字符串,请执行相反的操作:

char **keys= mmap(NULL, ...);
char *str= (char*) (&keys[0]) + (ptrdiff_t) keys[0];
Run Code Online (Sandbox Code Playgroud)

它有点麻烦但无论mmap返回什么都可以.