当前位置: 首页 > article >正文

记一次Linux共享内存段排除Bug:key值为0x0000000的共享内存段删除不了

在这里插入图片描述

本文目录

  • 一、问题情况
  • 二、解决方法
    • 2.1 通过kill命令删除
    • 2.2 通过程序删除

一、问题情况

今天查看共享内存段发现好多共享内存段,而且命令ipcrm -m <shmid>删除不了。

回想了一下,应该是有一些程序跑while循环,或者死循环,不让进程结束,只要挂接数(nattch)还不为0,说明共享内存还被占用,所以无法删除,但是以dest作为标记,表明只要进程结束,就会自动删除共享内存。

在这里插入图片描述

二、解决方法

2.1 通过kill命令删除

通过ipcs -mp查看一些对应的创建者PID。然后Kill -9即可。

在这里插入图片描述
来看看kill之后的结果,确实可以删掉。

在这里插入图片描述
除了直接查看pid命令,我们也可以通过代码进行获取:

struct shmid_ds结构体原型,shm_cpid是创建共享内存时的pid,shm_lpid是最后一次使用这个共享内存进程的id。所以可以通过构建声明一个结构体类型的shmid_ds保存共享内存的信息。

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main()
{
    int res;
    int id[7] = {1664,1662};   //shmid
    struct shmid_ds ds; //声明一个结构体类型的shmid_ds保存共享内存的信息
    for(int i = 0; i < 2; i++){
        res = shmctl(id[i], IPC_STAT, &ds);  //查询共享内存
        if (res == -1)
        {
            perror("shmctl error!");
            exit(-1);
        }
        printf("cpid = %d, lpid = %d\n", ds.shm_cpid, ds.shm_lpid); //获取创建PID和最后使用的PID
    }
    return 0;
}

2.2 通过程序删除

以使用 shmat 函数将其附加到进程的地址空间,然后使用 shmdt 函数将其分离。这将释放该共享内存段,使其成为不可用状态,最后再删除该共享内存。

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
 
int main() 
{
    int shmid;
    void *shmaddr;
 
    // 获取共享内存标识符
    shmid = shmget(0x00000000, 1, 0);
    if (shmid == -1) {
        perror("shmget");
        return 1;
    }
 
    // 连接共享内存到进程地址空间
    shmaddr = shmat(shmid, NULL, 0);
    if (shmaddr == (void *)-1) {
        perror("shmat");
        return 1;
    }
 
    // 脱离共享内存
    if (shmdt(shmaddr) == -1) {
        perror("shmdt");
        return 1;
    }
 
    // 删除共享内存段
    if (shmctl(shmid, IPC_RMID, NULL) == -1) {
        perror("shmctl");
        return 1;
    }
 
    printf("Shared memory segment detached and deleted successfully.\n");
 
    return 0;
}

http://www.kler.cn/a/518832.html

相关文章:

  • TCP/IP 协议:互联网通信的基石
  • 82,【6】BUUCTF WEB .[CISCN2019 华东南赛区]Double Secret
  • 05.KNN算法总结
  • gradle创建springboot单项目和多模块项目
  • C++异步future
  • CF 339A.Helpful Maths(Java实现)
  • android 获取图标主要颜色作背景色
  • Gurobi基础语法之字典
  • Leecode刷题C语言之找到最接近0的数字
  • 网络安全 | F5-Attack Signatures详解
  • mysql-04.索引
  • 2_高并发内存池_各层级的框架设计及ThreadCache(线程缓存)申请内存设计
  • 数据可视化的图表
  • 找不到mfc140u,具体原因分析
  • Ubuntu20.04 深度学习环境配置(持续完善)
  • RA-Eco-RA2L1-48PIN-V1.0开发板前期准备避坑指南
  • Apache Doris 2.1.8 版本正式发布
  • 51单片机——串口向电脑发送数据
  • RDMA 工作原理 | 支持 RDMA 的网络协议
  • C语言教程——文件处理(2)
  • 神经网络|(四)概率论基础知识-古典概型
  • MaxCompute—阿里云原生大数据计算机服务——SQL概述与服务支持
  • linux-execve的使用
  • C# 利用ssh 开启一个命令交互窗口
  • 微信小程序部分用户报错ERR_CONNECTION_REFUSED连接被拒绝
  • 海外问卷调查如何影响企业的经营?在品牌建设中有何指导意义?