【问题标题】:c structure in shared memory共享内存中的c结构
【发布时间】:2011-11-10 00:40:05
【问题描述】:

我有一个类似

的结构
struct board{
   char name;
   int values[37];
}board

想象一个游戏,其中有几个玩家在一张桌子上玩,他们都在 values 数组的不同位置下不同的赌注。棋盘的名称是唯一的,玩家进入游戏时指定棋盘的名称。如果 2 位或更多玩家输入相同的棋盘名称,他们都会加入同一个游戏。

我需要将此结构放入共享内存并访问/修改“值”的内容
同时来自不同的进程(信号量不是问题)。我设法将结构复制到一块共享内存中,但我不知道如何访问名称以查看板是否已经存在以及类似的东西。

这是一个学校项目,我有点绝望....请帮助和感谢。顺便说一下,共享内存我要引用POSIX os

【问题讨论】:

  • C 中没有“共享内存”之类的东西。如果您指的是任何特定于平台的概念,请明确指定平台(例如“这是给我的 TI-95 计算器”)。
  • 首先,名称只是一个字符。它应该是指针或数组。为什么不将整个结构复制到共享内存中呢?然后您可以像访问任何其他结构一样访问它。另外,为什么要共享内存?每个玩家是在计算机上启动自己的程序,还是通过某种网络连接?
  • 你的 shm 库不支持命名内存区域吗?如果是这样,您可以将每个板映射到一个内存区域。要么,要么使用红黑树来跟踪(name, (struct board *)) 对。另外,你的意思是char *name? (固定大小的char 数组更适合 shm,因为它更容易复制和使用指针。

标签: c memory structure shared


【解决方案1】:

POSIX 共享内存函数在编写时已经考虑到了这种努力:

int shm_open(const char *name, int oflag, mode_t mode);

如果您使用"/onica_game_<name>" 作为您的*name 参数,您可以轻松地为您的共享游戏指定要附加到哪些共享内存段。 (顺便说一句,单个 char 对游戏名称有点限制。您可能希望使用 char name[32]; 或更大的名称,让人们有机会为他们的游戏命名更有意义的名称。)

我建议在名称前加上 onica_game_ 前缀,因为 POSIX 共享内存段的命名空间是系统范围的。

【讨论】:

  • 感谢您的回复,但这只是我问题的一部分。在我将结构放入共享内存的一部分之后(使用 shm_open、truncate、mmap 和 memcp 来复制结构),我最终得到的是指向该内存段开头的指针 *ptr。现在我如何将例如 2 放入只有一个指针的值 [16] 中??? :-
  • @OonicaRadu“只有一个指针”???指针很神奇,它们让你的愿望成真
  • @Onica:使用* 取消引用指针,即访问底层对象类型。如果ptr 是指向double 类型对象的指针,则*ptr 是双精度型。要访问结构的成员,请使用 . 运算符。如果tstruct tm 类型的对象,则t.tm_hour 访问名为“tm_hour”的成员。将指针 (ptr) 和结构放在一起可以得到(*ptr).member,或者,作为编写相同内容的更简单方法:ptr->member
猜你喜欢
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多