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