繁体   English   中英

使用带有mmap的灵活数组成员

[英]using flexible array member with mmap

我无法访问使用mmap初始化的全局结构指针。 尝试在抛出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是一个定义的值,应该足够满足我的需求。

无论如何,我对(...)表示歉意,但这是出现问题的地方。 我没有碰运气就看过mmap文档和可变长度方法。 提前致谢!

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

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

foo = mmap(...);

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

而且,如果我没记错的话,文件的长度必须至少为BIG_SIZE ,否则mmap将会失败-但我可能在那部分上是错误的...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM