簡體   English   中英

將結構數組復制到共享內存中

[英]Copying array of structs into shared memory

我有多個處理相同數據的進程。 我想將數據保留在共享內存中。 問題是似乎我無法將其保存(或檢索)。

我的整個代碼在這里: 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);
  };
}

您有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 */ 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM