欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 记一次Linux共享内存段排除Bug:key值为0x0000000的共享内存段删除不了

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

2025/2/22 2:06:04 来源:https://blog.csdn.net/theaipower/article/details/145359807  浏览:    关键词:记一次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};   //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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词