当共享内存键值为0x00000000的时候,可能是有进程在使用这个共享内存。
比如:
用ipcs -m 列出来后有0的键值
发现此时用ipcrm 删除不了
有两种方法。
1:可以使用 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;
}
2:暴力把使用该共享内存的进程退出
ipcs -mp 看这个共享内存被哪个进程使用,找到后用kill 进程id 。