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

news/2025/1/26 15:20:06/

在这里插入图片描述

本文目录

  • 一、问题情况
  • 二、解决方法
    • 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};   //shmidstruct 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.ppmy.cn/news/1566339.html

相关文章

(CICD)自动化构建打包、部署(Jenkins + maven+ gitlab+tomcat)

一、平滑发布与灰度发布 **什么叫平滑&#xff1a;**在发布的过程中不影响用户的使用&#xff0c;系统不会因发布而暂停对外服务&#xff0c;不会造成用户短暂性无法访问&#xff1b; **什么叫灰度&#xff1a;**发布后让部分用户使用新版本&#xff0c;其它用户使用旧版本&am…

GeoJSON 数据

一、GeoJSON 数据的概述 GeoJSON 是一种基于 JSON 格式的地理信息数据交换格式&#xff0c;它用于表示地理要素及其属性。GeoJSON 可以用来描述点、线、面等几何形状&#xff0c;并且可以为这些几何形状添加额外的属性信息&#xff0c;被广泛应用于地理信息系统&#xff08;GI…

Kafka 消费端反复 Rebalance: `Attempt to heartbeat failed since group is rebalancing`

文章目录 Kafka 消费端反复 Rebalance: Attempt to heartbeat failed since group is rebalancing1. Rebalance 过程概述2. 错误原因分析2.1 消费者组频繁加入或退出2.1.1 消费者故障导致频繁重启2.1.2. 消费者加入和退出导致的 Rebalance2.1.3 消费者心跳超时导致的 Rebalance…

7.渲染管线——几何阶段的概述

几何阶段是渲染管线中的一个重要部分&#xff0c;主要负责处理3D模型的几何信息&#xff08;比如顶点位置、形状、大小等&#xff09;&#xff0c;并将它们转换为屏幕上的2D图像。用通俗易懂的方式来解释&#xff1a; 通俗解释&#xff1a;几何阶段就像把3D模型“拍扁”成2D照片…

我的创作纪念日——1/23

机缘 想起写博客&#xff0c;其实是当时看鹏哥C语言时&#xff0c;他说通过写博客的方式来记录自己学习过程&#xff0c;有利于提升自己。尽管我只看了几集就没怎么看&#xff0c;但是写博客的习惯保留下来。 至于为什么&#xff0c;一方面单纯当作单个代码库&#xff0c;把自…

Linux权限有关

文章目录 一、添加普通用户二、Xshell下命令行的知识三、 Linux和Windows操作系统四、再探指令和Linux权限五、用户相关用户切换: 今天我们学习与Linux有关的权限等内容&#xff0c;以及一些零碎知识帮助我们理解Linux的系统和Xshell的原理。 本篇是在Xshell环境下执行的。 一…

存储过程优化实践:统一返回结构、参数 JSON 化与事务原子化

存储过程作为数据库中执行复杂业务逻辑的重要工具&#xff0c;在提升性能、保障数据一致性和简化维护方面发挥着重要作用。然而&#xff0c;随着应用程序和数据的复杂度不断增加&#xff0c;存储过程也面临着性能瓶颈、维护难度和扩展性问题。为了应对这些挑战&#xff0c;优化…

人工智能的未来:AGI、ACI与ASI的探索

人工智能的引言 人工智能技术迅速发展&#xff0c;逐步渗透入生活的方方面面。对于许多人而言&#xff0c;人工智能的未来似乎是一场美丽的梦&#xff0c;也是一场可能的噩梦。三种主要类型的智能——通用人工智能&#xff08;AGI&#xff09;、具能人工智能&#xff08;ACI&a…