Использование гибкого элемента массива с 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
потерпит неудачу - но я могу ошибаться в этой части...