SIGBUS(Bus error singal 7)

在使用mmap进行文件映射时遇到了SIGBUS Bus Error,通过对比SIGBUS和SIGSEGV的区别,了解到这可能是由于有效的地址但访问异常导致。通过调试发现,映射的文件大小为0,原因是文件不存在时open创建的文件大小默认为0。由此,确定解决方案是确保映射内存大小与实际文件大小匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

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

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值