2010-11-05 9 views
3

У меня есть 2 программы, которые совместно используют файл заголовка. Этот заголовочный файл определяет структуру с несколькими членами. Тогда есть #define: #define STRUCTURE_SIZE sizeof(OUR_STRUCTURE).sizeof возвращает разные значения для структуры при компиляции разных программ

Эта структура затем используется в общей памяти с STRUCTURE_SIZE, используемой для аргумента size для shmget().

К сожалению, для одной программы STRUCTURE_SIZE составляет 20758, а в другой - 20764. Поэтому, когда вторая программа пытается получить общий mem, shmget() возвращает EINVAL.

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:

g++ (GCC) 4.4.1 20090725 (Red Hat 4.4.1-2)

+0

Опубликовать код. Что такое OUR_STRUCTURE? –

+0

Требуется определение OUR_STRUCTURE. –

+0

Я бы, но я сдержанный стажер и не знаю, действительно ли мне это нужно. Эта структура является основой системы, по существу. – xxpor

ответ

13

Несколько возможностей:

  • вы собираете две программы с различными компиляторами и/или компилятором переключатели
  • вы другой заголовок, который появляется перед заголовком в вопросе в одной из программ, и это ухудшит с #pragma pack или подобными и не восстанавливает настройку
  • типа, который используется в общей структуре определяется по-разному в две программы

(Примечание:. последние две точки можно рекурсивно применять к любым другим, которые структур, используемых в задаче структуры)

+1

'#pragma pack (8)' исправлено. Благодаря! – xxpor

2

проблема может быть упаковка или выравнивание проблемы. Узнайте, как сообщить своему компилятору, как он должен выравнивать структуры.

2

Другие возможности:

  • Набор определения, используемые в двух сборниках отличается, и структура определена условно на этих Определяет
  • Некоторые типы могут иметь различные размеры в ядре и пользовательском пространстве (это редко, но это может случиться)
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; 
Смежные вопросы