Использование гибкого элемента массива с mmap

У меня проблемы с доступом к глобальному указателю структуры, который я инициализирую с помощью mmap. Попытка получить доступ к членам структуры в функциях вне той, которая объявлена ​​в throw segfaults.

структура:

typedef struct foo {
  uint32_t size;
  bar_t array[0];
} foo_t;

инициализация:

foo_t* foo; // global

static void* init_function(...) {
  fd = open(filename, O_CREAT | O_WRONLY, 0644);
  write(...);
  lseek(...);
  write(...);
  foo = mmap(0, BIG_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  close(fd);
  foo->size = 0;
}

что вызывает segfault:

static int another_function(...) {
  if (foo->size == 0) {...} //foo->size causes it
}

BIG_SIZE - это определенное значение, которое должно быть достаточно большим для моих нужд.

В любом случае, я прошу прощения за (...), но именно здесь проблемы обнаруживаются. Я посмотрел в mmap документы и методы переменной длины без удачи. Заранее спасибо!

2 ответа

Вы не показываете нам все, но кажется, что вы просто присваиваете свою глобальную переменную, но не инициализируете содержимое отображаемой области. Вы должны по крайней мере дать емуfoo->size = 0 где-то, если файл только что создан, или вы должны использовать ftruncate вместо вашего fseek write последовательность, чтобы гарантировать, что блоки (в том числе size) являются 0 заполнены.

Сначала проверьте, действительно ли mmap удалось:

foo = mmap (...);

if (MAP_FAILED == foo) {// нет памяти для меня... }

И если я правильно помню, файл должен быть хотя бы BIG_SIZE долго, иначе mmap потерпит неудачу - но я могу ошибаться в этой части...

Другие вопросы по тегам