【问题标题】:how to declare a struct at a specific address?如何在特定地址声明结构?
【发布时间】:2014-04-24 18:27:41
【问题描述】:

我有 2 个应用程序使用共享内存段将数据从写入进程传递到读取进程。在共享内存段的顶部,我想声明一个单独的头结构来包含通用段数据,例如缓冲区计数值、读/写偏移量、pthread 互斥体/条件变量等。头结构不包含任何指针。然后该段的其余部分用于在 2 个进程之间传递的实际数据。

由于共享内存段附加到进程,我确信该段确实对进程有效/可访问。简单地将基段指针转换为头结构类型的指针很容易,并且对于常规数据类型(如整数等)非常有效,但不适用于结构中的非整数数据类型,如 pthread 互斥锁/条件变量,因为它们实际上并没有被声明和分配。

那么,如何声明和分配我的头结构以从我已经分配的共享内存段的特定地址开始?

以下似乎不起作用:

SmHeader header = *((SmHeader *)m_pBaseAddress);

m_pHeader = &header;

其中 SmHeader 是我的标头结构的 typedef,m_pBaseAddress 是附加共享内存段的基地址。

谢谢, -安德烈斯

【问题讨论】:

  • 显示更多代码,包括您的m_pHeader 的声明(可能还有包含它的class)。也许你可以声明smHeader &header= *(ShHeader*)m_pBaseAddress;

标签: c++ linux shared-memory


【解决方案1】:

我认为它不起作用,因为您创建它的方式:

// this creates a copy of the SmHeader struct, on the stack
SmHeader header = *((SmHeader *)m_pBaseAddress);

// this sets m_pHeader to address of the local variable, not
// m_pBaseAddress
m_pHeader = &header;

试试这个:

m_pHeader = (SmHeader *) m_pBaseAddress;

【讨论】:

  • 谢谢你们的回复。您的建议正是我所拥有的,但似乎不起作用,因为它没有声明或分配标头结构。这对于结构中的 int、chars 等很好,但 pthread 变量不会通过仅定义指针来分配。
  • @AndresGonzalez 我不知道您所说的“已分配”是什么意思。内存已经分配,​​因为它是共享内存段的一部分。你正在“声明”一个指向它的指针。 “pthread 变量”具体出了什么问题(它们是什么类型的变量)?
  • 您的第一条语句是否真的在堆栈上创建了结构?
  • @AndresGonzalez 哪个声明? 你的第一条语句。内部转换(将共享内存地址转换为SmHeader *)告诉编译器“查看此内存并将其内容视为SmHeader 结构”。然后使用* 取消引用该指针并将其内容复制到新创建的header 变量,该变量是SmHeader 类型的本地堆栈变量。这肯定不是你想要的。
  • 问题是 pthread 互斥锁不能正常工作。我最初使用与您相同的推理,认为 pthread objs 的实际空间显然已分配,所以没问题。但是由于互斥锁不起作用(它是正确共享进程的),我想我一定不能正确分配完整的结构。
猜你喜欢
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多