【发布时间】: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 个由单个进程分配的指针。那些mallocated 地址是虚拟化的。你不能在进程之间共享那些“价值”。 -
我会检查的。你给了我一个想法。谢谢
-
我还将在现代平台上使用
mmap更改实现,而不是 System V 函数,用于共享内存。
标签: c ipc shared-memory