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
,则不会发生此问题。
我想知道是否有任何解决方法,如果没有,为什么会这样呢?
谢谢!
答案 0 :(得分:1)
对IPC使用共享内存时,所有要共享的数据必须位于共享内存中。它很简单,没有办法解决它。但是,对于一些更大,更多变量的数据块,您可以做的只是为该数据分配一个专用的共享内存块,并通过主表提供其名称。在您的情况下,另一个选项是安排共享内存足够大于info
结构,这样name
只是从该地址到名称数据所在位置的偏移量。然后数据的地址是`&amp; name + * name&#39;。