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

本文目录

一、问题情况

今天查看共享内存段发现好多共享内存段,而且命令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保存共享内存的信息。

cpp 复制代码
#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 函数将其分离。这将释放该共享内存段,使其成为不可用状态,最后再删除该共享内存。

cpp 复制代码
#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;
}
相关推荐
眠修1 小时前
Kuberrnetes 服务发布
linux·运维·服务器
开-悟1 小时前
嵌入式编程-使用AI查找BUG的启发
c语言·人工智能·嵌入式硬件·bug
一入JAVA毁终身1 小时前
Data的时区格式BUG
bug
即将头秃的程序媛4 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
fangeqin4 小时前
ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法
linux·python·ubuntu·openssl
爱奥尼欧5 小时前
【Linux 系统】基础IO——Linux中对文件的理解
linux·服务器·microsoft
超喜欢下雨天6 小时前
服务器安装 ros2时遇到底层库依赖冲突的问题
linux·运维·服务器·ros2
tan77º6 小时前
【Linux网络编程】网络基础
linux·服务器·网络
笑衬人心。7 小时前
Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南
linux·mysql·ubuntu
chanalbert9 小时前
CentOS系统新手指导手册
linux·运维·centos