use*_*798 5 share pointers fork process shared-memory
如果我想char **keys
在fork()
'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返回什么都可以.