背景
用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);