gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:53:49 24 4
gpt4 key购买 nike

菜鸟警告,这里用 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 name[20] char *name,则不会出现此问题。

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

谢谢!

最佳答案

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

关于c - 使用 shm_open 在 C 结构中共享 char 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46996519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com