我有两个共享头文件的程序。此头文件定义具有少量成员的结构。然后是#define:#define STRUCTURE_SIZE sizeof(OUR_STRUCTURE)
。
然后在共享内存中使用此结构,STRUCTURE_SIZE
用于size
的{{1}}参数。
不幸的是,对于一个程序,STRUCTURE_SIZE最终为20758,而在另一个程序中,它最终为20764.因此当第二个程序试图获取共享内存时,shmget()
返回EINVAL。
shmget()
:
uname -a
Linux machine 2.6.30.10-105.2.23.fc11.i686.PAE #1 SMP Thu Feb 11 07:05:37 UTC 2010 i686 i686 i386 GNU/Linux
:
g++ --version
答案 0 :(得分:13)
一些可能性:
#pragma pack
或类似的混淆并且不会恢复设置(注意:最后两点可以递归地应用于问题结构中使用的任何其他结构。)
答案 1 :(得分:2)
问题可能是打包或对齐问题。了解如何告诉编译器应该如何对齐结构。
答案 2 :(得分:2)
其他可能性:
答案 3 :(得分:2)
您可以通过编写一些代码来检查OUR_STRUCTURE
中的字段偏移并打印出来,然后依次使用这两个编译来获得一些理解。细分总结构大小以确定每个字段引起的大小。
struct OUR_STRUCTURE
{
double d;
other_structure other;
bool flag;
};
OUR_STRUCTURE ours;
cout << &ours.d - &ours << endl;
cout << &ours.other - &ours << endl;
cout << &ours.flag - &ours << endl;
cout << &ours + sizeof(OUR_STRUCTURE) - &ours.flag << endl;