1

我无法访问使用 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 文档和可变长度方法,但没有运气。提前致谢!

4

2 回答 2

0

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

foo = mmap(...);

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

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

于 2015-04-29T08:00:44.467 回答
0

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

于 2015-04-29T07:51:26.493 回答