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

时间:2017-10-29 03:15:50

标签: c arrays struct shared-memory

noob alert with C here。

我有一个结构

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运行此并放入一些文本,请说&#34; foo&#34;在name数组元素的table字段中,进程A无权访问char*。 它所看到的只是一个内存地址,而不是char*的实际内容,而不是内容本身。不过,我还要注意,如果我将char*替换为固定大小char[],请说char name[20]而不是char *name,则不会发生此问题。

我想知道是否有任何解决方法,如果没有,为什么会这样呢?

谢谢!

1 个答案:

答案 0 :(得分:1)

对IPC使用共享内存时,所有要共享的数据必须位于共享内存中。它很简单,没有办法解决它。但是,对于一些更大,更多变量的数据块,您可以做的只是为该数据分配一个专用的共享内存块,并通过主表提供其名称。在您的情况下,另一个选项是安排共享内存足够大于info结构,这样name只是从该地址到名称数据所在位置的偏移量。然后数据的地址是`&amp; name + * name&#39;。