我有多個進程操作相同的數據。我想將數據保存在共享內存中。問題似乎我無法保存到它(或檢索)。將結構數組複製到共享內存中
我爲它整個代碼是在這裏: 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'返回一個指向共享內存的指針,而不是指針的指針。 – LPs
我認爲你的代碼中的主要問題是你正在想通過進程之間的共享內存來共享指針。 您的'玩家'數組包含2個由一個進程分配的指針。這些'malloc'地址是虛擬化的。你不能在流程之間分享這些「價值」。 – LPs
我會檢查一下。你給了我一個主意。謝謝 –