代码之家  ›  专栏  ›  技术社区  ›  Nima Adib

使用shm\u open在C结构中共享字符指针

  •  0
  • Nima Adib  · 技术社区  · 7 年前

    这里是C。

    我有一个这样的结构

    typedef struct {
        char* name
    } info;
    

    并存储该结构的数组(大小为10)(在另一个名为 table )在使用shm\U open调用的共享内存对象中:

    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运行它并放入一些文本,则在 name 元素的字段 桌子 数组,进程A无权访问该 char* . 它看到的只是一个内存地址,而不是 字符* 而不是它自己写内容。然而,我还要指出,如果我替换 字符* 具有固定大小 char[] char name[20] 而不是 char *name ,则不会发生此问题。

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

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  1
  •   jwdonahue    7 年前

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