2016-02-19 35 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

谢谢。那太好了。问题解决了 –

相关问题