2016-02-19 102 views
1

我有多個進程操作相同的數據。我想將數據保存在共享內存中。問題似乎我無法保存到它(或檢索)。將結構數組複製到共享內存中

我爲它整個代碼是在這裏: 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); 
    }; 
} 
+1

'shmat'返回一個指向共享內存的指針,而不是指針的指針。 – LPs

+2

我認爲你的代碼中的主要問題是你正在想通過進程之間的共享內存來共享指針。 您的'玩家'數組包含2個由一個進程分配的指針。這些'malloc'地址是虛擬化的。你不能在流程之間分享這些「價值」。 – LPs

+0

我會檢查一下。你給了我一個主意。謝謝 –

回答

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(...); 

如註釋所示,結構的指針成員需要指向共享內存。

示例;

memstate.x = memstate + offset; /* use different offsets based on your usage */ 
+1

概念上正確,但''game_state_t'結構有'army_t * army'成員。該地址不能在進程之間共享。 – LPs

+0

沒錯。我同意。謝謝。共享內存的某些部分可以使用。我認爲我們在這裏不需要堆分配。所有可以存儲在共享內存本身。 –

+0

謝謝。那太好了。問題解決了 –

相關問題