将结构数组复制到共享内存中
Posted
技术标签:
【中文标题】将结构数组复制到共享内存中【英文标题】:Copying array of structs into shared memory 【发布时间】:2016-02-19 14:29:50 【问题描述】:我有多个处理相同数据的进程。我想将数据保存在共享内存中。问题是我似乎无法保存(或检索)。
我的全部代码在这里: https://github.com/kasperekt/LLGame/blob/master/server_src/game_state.c#L74
但问题似乎出在这些函数内部:
typedef struct game_state
int resources;
int wins;
army_t *army;
game_state_t;
...
static game_state_t *players[2] = NULL, NULL ;
static game_state_t **mem_state = NULL;
...
void attach_state()
mem_state = get_memory_data(0);
players[0] = mem_state[0];
players[1] = mem_state[1];
void save_state()
if (mem_state == NULL)
mem_state = get_memory_data(0);
mem_state[0] = players[0];
mem_state[1] = players[1];
detach_memory_data(mem_state);
以及适用于此数据的示例函数:
void increment_resources(int player_id)
attach_state();
const int workers_count = players[player_id]->army->workers;
players[player_id]->resources += RESOURCES_STEP + (workers_count * 5);
save_state();
我应该如何将它保存到内存中?它是如何工作的?我找不到这个问题的答案。
也许这段代码也会有所帮助:
game_state_t **get_memory_data(char *shmaddr)
const int shmat_flag = 0;
return shmat(memory_id, shmaddr, shmat_flag);
void detach_memory_data(game_state_t **data)
if (shmdt(data) == -1)
perror("Error detaching memory: ");
exit(1);
;
【问题讨论】:
shmat
返回一个指向共享内存的指针,而不是指针的指针。
我认为您的代码中的主要问题是您正在考虑通过进程之间的共享内存来共享指针。您的 players
数组包含 2 个由单个进程分配的指针。那些malloc
ated 地址是虚拟化的。你不能在进程之间共享那些“价值”。
我会检查的。你给了我一个想法。谢谢
我还将在现代平台上使用 mmap
更改实现,而不是 System V 函数,用于共享内存。
【参考方案1】:
你有 game_state_t 变量。如果要存储多个状态,则只需要一维数组。这是示例。
game_state_t *memstate;
...
memstate = (game_state_t *) malloc( n * sizeof(game_state_t)); /* alloc memory for n states */
shmptr = shmat(...);
memcpy(shmptr, memstate, size); /* size for example n * size of(game_state_t)); */
或者只使用共享内存。
memstate = shmat(...);
如 cmets 所示,结构的指针成员需要指向共享内存。
示例;
memstate.x = memstate + offset; /* use different offsets based on your usage */
【讨论】:
在概念上是正确的,但game_state_t
结构有一个 army_t *army
成员。此地址不能在进程之间共享。
正确。我同意。谢谢。可以使用共享内存的某些部分。我认为我们在这里不需要堆分配。所有都可以存储在共享内存本身中。以上是关于将结构数组复制到共享内存中的主要内容,如果未能解决你的问题,请参考以下文章