В следующей простой программе:
# include <sys/mman.h>
# include <fcntl.h>
# include <cstdlib>
# include <cassert>
struct rgn_desc
{
size_t end_;
char data[];
};
int main(int argc, const char *argv[])
{
int fd = open("foo.mm", O_RDWR|O_CREAT|O_TRUNC, (mode_t)0700);
assert(fd != -1);
void * ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_POPULATE, fd, 0);
assert(ptr != (void*) -1);
rgn_desc * rgn_ptr = (rgn_desc*) ptr;
rgn_ptr->end_ = 0; // <-- bus error
}
По сути, я хочу управлять простым mmaped распределителем арены и сохранять в качестве первой части отображения выделенные мною байты. Итак, когда я восстановлюсь из файла, я получу, сколько байтов было выделено.
Однако последняя строка дает мне bus error
. Может ли кто-нибудь объяснить, почему и, если возможно, предложить мне способ избежать этого. Я использую Linux на 32-битном Pentium и использую компилятор clang ++