使用 shm_open 在 C 结构中共享字符指针

Sharing char pointers in C structs using shm_open

菜鸟在这里用 C 提醒。

我有这样的结构

typedef struct {
    char* name
} info;

并使用 shm_open 调用将此结构的数组(大小为 10)(在另一个名为 table 的结构中)存储在共享内存对象中:

int fd = shm_open("someName", O_CREAT | O_EXCL | O_RDWR, S_IRWXU);
if (fd < 0) {
     fd = shm_open("someName", O_CREAT | O_RDWR, S_IRWXU);
     if (fd < 0) {
         printf("ERROR: Could not open shared memory space\n");
         return -1;
     }
}
(*tables) = mmap(NULL, sizeof(table), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
ftruncate(fd, sizeof(table));
close(fd);

但是,我遇到的问题是,稍后通过代码会发生这样的情况: 如果进程 B 运行它并在 table 数组的一个元素的 name 字段中放置一些文本,例如 "foo",则进程 A 无法访问该 char*。 它看到的只是一个内存地址,而不是 char* 的实际内容,而不是它自己写的内容。但是,我还要注意,如果我将 char* 替换为固定大小 char[],说 char name[20] 而不是 char *name,则不会出现此问题。

我想知道有没有办法解决这个问题,如果没有,为什么会这样?

谢谢!

IPC 使用共享内存时,所有要共享的数据都必须位于共享内存中。就这么简单,没有办法绕过它。然而,对于一些更大、更可变的数据块,您可以做的是简单地为该数据分配一个专用的共享内存块,并通过 master table 提供其名称。在您的情况下,另一种选择是安排共享内存比您的 info 结构足够大,这样 name 只是该地址到名称数据所在位置的偏移量。那么数据的地址就是`&name + *name'.