使用灵活的数组成员与mmap

时间:2015-04-29 07:41:32

标签: c struct segmentation-fault mmap flexible-array-member

我无法访问我正在使用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;
}

导致段错误的原因:

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

BIG_SIZE是一个定义的值,应该足够大以满足我的需求。

任何方式,我为(...)s道歉,但这是问题出现的地方。我已经研究过mmap docs和可变长度方法而没有运气。提前谢谢!

2 个答案:

答案 0 :(得分:0)

您没有向我们展示所有内容,但您似乎只是分配了全局变量,但是您没有初始化映射区域的内容。你应该至少给它一个 foo->size = 0某处,如果文件是新创建的,或者您应该使用ftruncate而不是fseek write序列来保证块(包括size)为{{1}填充。

答案 1 :(得分:0)

首先检查mmap是否真的成功了:

foo = mmap(...);

if(MAP_FAILED == foo) {    //对我没有记忆...... }

如果我没记错的话,该文件的长度必须至少BIG_SIZE,否则mmap会失败 - 但我可能错了......