我正在使用forking的服务器上工作,该服务器在共享内存中存储字符串的映射(k-> v)。我想这样做非常简单,但我迷失了指针,我究竟需要复制什么。所以我提取了相似的代码,如下所示:
struct key_value {
char key[32];
char value[32];
};
struct key_value **map;
int *map_size;
int shmid = shmget(IPC_PRIVATE, sizeof(struct key_value**), 0600);
map = (struct key_value**) shmat(shmid, 0, 0);
int shmid_size = shmget(IPC_PRIVATE, sizeof(int), 0600);
map_size = (int*) shmat(shmid_size, 0, 0);
*map_size = 0;
//the above happens before fork()
char *c = "abc";
int shmid_struct = shmget(IPC_PRIVATE, sizeof(struct key_value*), 0600);
struct key_value *entry = (struct key_value*) shmat(shmid_struct, 0, 0);
*entry->key = *c;
printf("%s\n", map[0]->key);
//smhdt's & shmctl's
所以我想要的是将"abc"
中的字符串*c
复制到map
,然后复制到共享内存中。显然,我还没有完全理解指针和结构,所以我希望有人可以清理它。我目前在主要的某个地方遇到了一个段错误。 (感谢gdb ......)。
请注意,我现在可以使用具有固定max_size的地图(虽然如果动态的话会很棒)。
编辑:在答案中已经指出,结构中有char*
是困难的,所以要使用char [x]代替。已更新代码以反映该代码,但仍无效。
答案 0 :(得分:3)
包含指针的结构无法安全地存储在共享内存中,因为指针在创建它们的进程之外毫无意义。即使共享内存区域映射到每个进程中的相同地址(如果内存在objIE.Document.getElementsByName("q")[0].Value = Sheets("2016").Range("c3").Value
之前映射也是如此,但在其他情况下可能为false),指向非共享内存的指针将不会表现正确地说,因为每个进程在该地址可能有不同的数据。
如果要将字符串存储在共享内存中,则需要将它们存储为显式字符数组,例如
fork()
或使用其他方案,例如将偏移量存储到共享内存区域中的字符串表中。
但一般来说,共享内存不是进程间通信的好工具。如果您的应用程序依赖于能够在内存中共享数据,则线程可能是更好的方法。