linux进程间通信使用共享内存踩坑笔记

在Linux系统中,程序使用shmget函数申请共享内存时遇到问题。新程序由于增大了size,在存在相同key的共享内存时,shmget返回-1。原因是系统检测到key已存在但size不匹配。通过ipcs命令检查共享内存状态,使用ipcrm命令删除遗留的共享内存段解决了问题。
摘要由CSDN通过智能技术生成

linux的程序通过调用下面函数申请一块共享内存:

int shmget(key_t key, size_t size, int shmflg);

调用此函数,如果能正常申请到共享内存,返回一个共享内存块的shmid。如果失败,返回-1;

因业务需求变更,需要修改程序把size调大。修改后的程序,在调试过程中,有时候shmget()能正常申请到内存,有时候返回-1。而运行旧版本程序,每次都能成功申请到共享内存。

系统里运行命令sysctl -a | grep shm,查看系统限制的共享内存最大值,size未超过最大值。

最终找到故障原因:

因为在同一台linux电脑上反复运行新老程序做对比,老程序ctrl+c强制退出后有时不能正常删除申请到的共享内存。老程序之所以能反复正常运行,是因为每次申请的共享内存key都一样,size都一样,调用shmget()函数,系统判断不存在key标识的共享内存则会新创建,存在则返回已有共享内存,不会报错。

新程序和老程序的key一样,但新程序的size比老程序的size大。新程序调用shmget()函数,系统判断不存在key标识的共享内存则会新创建,此种情况新程序启动正常。如果系统存在key标识的共享内存,因为size比老程序大,所以shmget()函数会返回-1,此种情况新程序启动失败。

解决方案:

1、打印shmget()函数返回的shmid。

2、linux运行命令查看系统里存在的共享内存:

$ ipcs
------------ 共享内存段 --------------
键        shmid      拥有者  权限     字节     连接数  状态      
0x65010002 65539      root   666     512000     0                       
0x00000000 4          root   600     16384      1     目标  

3、linux里手动删除老程序退出时未能正常删除的shmid所指的共享内存:

$ ipcrm -m 65539

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值