mmap内存区域的总线错误

时间:2018-06-29 04:17:07

标签: c++ mmap

在以下简单程序中:

# 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。有人可以解释为什么,如果可能的话,向我建议避免的方法。我在32位奔腾操作系统上运行Linux,并使用clang ++编译器

1 个答案:

答案 0 :(得分:2)

根据文档,sig总线可以在以下情况下触发:

SIGBUS
    Attempted access to a portion of the buffer that does not
    correspond to the file (for example, beyond the end of the
    file, including the case where another process has truncated
    the file).

在您抓取的文件中,文件大小与mmap()的大小(0、4096)不匹配,因此您可以使用ftruncate()来增大文件的大小。

ftruncate(fd, 4096);