【发布时间】:2014-08-06 17:04:02
【问题描述】:
我让两个不同的进程使用共享内存相互交互,我观察到由于某种原因它不能按预期工作,问题是,当我放入数据时,缓冲区由于某种原因被额外的零填满进去。这是我的工作:
Process1 vc++(msvc2012主动解决平台Win32):
LPTSTR pBuf =(LPTSTR) MapViewOfFile(hMap, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
256);
if(!pBuf)
{
//handle errors
}
WaitForSingleObject(hExchangeData,INFINITE); //here i'm waiting data from the second process it should be DWORD value
DWORD someValue=0;
CopyMemory((PVOID)&someValue,pMemBuf,sizeof(DWORD)); //i get it and everything is ok, then the second process waits for this process to put some data in
int pBufSize=sizeof(DWORD); //counter
CopyMemory((PVOID)(pBuf+pBufSize),&hHandle1,sizeof(HANDLE));
pBufSize+=sizeof(HANDLE);
CopyMemory((PVOID)(pBuf+pBufSize),&hHandle1,sizeof(HANDLE));
SetEvent(exDone);
这里是流程二,用MinGW写的:线程模型:win32,gcc version 4.8.1 (GCC)
pBuf = (LPTSTR) MapViewOfFile(hMap,
FILE_MAP_WRITE | FILE_MAP_READ,
0,
0,
256);
if (pBuf == NULL)
{
//handle errors
}
DWORD myVal = 228;
memcpy(pBuf,&myVal,sizeof(DWORD)); //here i wrote some dword in there which first process is successfully receiving
SetEvent(dwordWritten);
int mySize = sizeof(DWORD); // counter
WaitForSingleObject(handlesWrittine,INFINITE); //waiting for some handles
CopyMemory((PVOID)&myHandle1,(PVOID)(pBuf+mySize),sizeof(HANDLE));
mySize += sizeof(HANDLE);
CopyMemory((PVOID)&myHandle2,(PVOID)(pBuf+mySize),sizeof(HANDLE));
所以基本上在第一个进程(msvc)中,我写了两个长度为 4 字节的句柄,因为在两个版本上 sizeof(HANDLE) =4,我检查了 printf,并且我希望在第二个中也收到 4 个字节(mingw+gcc) 进程,但是发生的是第一个进程中的内存缓冲区结构看起来像这样
1234 //dword
0012 //handle1
0013 //handle2
但在第二个过程中:
1234 //dword
0000
0012 //handle1
0000
0013 //handle3
所以从第二个进程最后一个CopyMemory 指令我得到0012 句柄值。为什么会有这样的不同?为什么我在第二个过程中得到额外的零?我尝试将 msvc 平台用于两个进程,它工作正常,但使用 mingw,gcc 没有。
【问题讨论】:
-
听起来像是成员变量的对齐和填充问题。
-
@CaptainObvlious 我需要将这三个变量对齐到零对齐?
-
pBuf 被声明为 LPTSTR 是问题所在。请参阅我的新答案。
标签: c++ c visual-c++ gcc shared-memory