2014-03-18 122 views
0

我有2个应用程序使用共享内存段将数据从写入过程传递到读取过程。在共享内存段的顶部,我想声明一个单独的头结构以包含常规段数据,例如缓冲区计数值,读/写偏移量,pthread互斥量/条件变量等。头结构不包含任何指针。然后剩下的段用于在两个进程之间传递的实际数据。如何在特定地址声明结构?

由于共享内存段连接到进程,因此我确信段确实对进程有效/可访问。只需简单地将基本段指针转换为头结构类型的指针,并且对于常规数据类型(例如ints等)非常适用,但不适用于结构中的非整数数据类型,例如pthread mutex /条件变量,因为它们尚未实际声明和分配。

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

以下不出现的工作:

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

m_pHeader = &header; 

其中SmHeader是我的报头结构的一个typedef和m_pBaseAddress是连接的共享存储器段的基本地址。

感谢, -Andres

+1

显示更多的代码,包括你的'm_pHeader'声明(也可能是包含它的'''')。也许你可能会声明'smHeader&header = *(ShHeader *)m_pBaseAddress;' –

回答

4

我想,因为这样你在创建它,它不工作:

// 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; 
+0

感谢您的回复。你的建议正是我所拥有的,但似乎并不奏效,因为它没有声明或分配头结构。这对结构中的整数,字符等是很好的,但是pthread变量不会通过定义指针来分配。 –

+0

@AndresGonzalez我不知道你的意思是“分配”。内存已被分配,因为它是共享内存段的一部分。而且你正在“声明”它的指针。什么*具体*出错了“pthread变量”(以及它们是什么类型的变量)? – TypeIA

+0

你的第一条语句实际上是在栈上创建结构体吗? –