段错误,shm_open打开文件失败【经验总结及解决方法】

背景:使用共享内存来进行进程间的通信
环境:ubuntu20.04,vscode,c++

1.头文件的问题
《操作系统概念》书中共享内存实现的代码中头文件使用的是<sys/shm.h>,可是当使用shm_open()以及mmap()等时报未定义符号的错误,编译的时候也已经加上了-lrt指令还是无效。将头文件改为<sys/mman.h>时解决。如下:
在这里插入图片描述
2.执行时发生段错误,导致我的窗口程序异常退出
后来发现原因在于共享内存文件创建失败,也就是shm_open()执行时未成功,返回-1,导致进行文件映射时失败,然后返回的是空指针,我使用了空指针指向的位置写入内容,当然会报段错误
在这里插入图片描述
3.shm_open()打开文件失败原因
shm_open会向/dev/shm创建文件,因此第一开始我以为是权限不足的原因,后来发现是创建文件的名称中使用了路径符号导致错误,可是官方给的实例中也带了路径符号,看来是一个坑。在这里插入图片描述
至于带路径符号时为什么会有错误原因,请看该博主
【记一次shm_open返回EINVAL的错误排查 - woder - 博客园】

后来发现还是存在着权限问题,在读取共享内存文件时发生错误,因此可能带路径符号应该不是问题所在,权限才是主问题。
在这里插入图片描述
因此创建时,权限不能设为0,如下更改权限设置:
在这里插入图片描述
最后,运行成功
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值