SIGBUS(Bus error singal 7)

Posted Nireus_LOVE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SIGBUS(Bus error singal 7)相关的知识,希望对你有一定的参考价值。

背景

用mmap将文件映射到内存,读取文件时,提示“SIGBUS Bus ERROR”错误

分析

SIGBUS与SIGSEGV信号的一般区别如下:
1) SIGBUS(Bus error)意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。
2) SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。
通过查找网上资料,发现上述描述,在gdb中查看发现映射的地址是有效地址。怀疑映射的内存大小和待写入的数据大小不一致,
查看所映射文件,发现其大小为0,初步确定原因是:用open打开文件,当文件不存在时创建的文件大小为0。

解决方法

(1) 打开文件并映射到内存
//文件不存在时创建
void* memory_malloc(size_t size, char *file)

    int fd = open(file, O_RDWR | O_CREAT, 0666);
    //修改文件大小,如果不指定,open默认创建的文件大小为0,导致BUS ERROR错误
    ftruncate(fd, size);

    void *p = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    close(fd);
    return p == (void*)-1 ? NULL : p;

(2) 从文件读取数据
 int64_t *p = static_cast<int64_t*>(file_malloc(sizeof(int64_t), file));
            if(p == NULL)
                return -1;          
        int64_t offset = *p;

 (3) 向文件写入数据
  int64_t* p = static_cast<int64_t*>(file_malloc(sizeof(int64_t), file));
  if(p == NULL)
      return -1;
  *p = 222;

以上是关于SIGBUS(Bus error singal 7)的主要内容,如果未能解决你的问题,请参考以下文章

信号 7 (SIGBUS),代码 2 (BUS_ADRERR)

Android RenderScript 信号 7 (SIGBUS),代码 1 (BUS_ADRALN),故障地址 0x76f458b4 Adreno 306、320

如何解决bus error

如何理解这次崩溃? : SIGBUS BUS_ADRALN

如何确定“BUS-Error”的原因

致命信号 7 (SIGBUS) 在 0x00000000 (code=2)