在使用共享内存的时,有时候程序异常结束,导致共享内存没有被释放,进而导致程序重新运行无法使用共享内存通信。
提示信息为 file exits ;
这时 我们 销毁共享内存
再重新运行就 OK
不用修改coredump 文件 ,也不要去gdb, bt查看了 。
ipcs 或者 ipcs-m 命令 显示当前的 system V
解决办法:
1.ipcs 或者 ipcs-m 命令 查看当前的 system V
2.在终端输入命令 ipcrm -m shmid(获取到的shmid值)即可删除共享内存
来 一波代码
comm.hpp:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define PATHNAME "."
#define PROJ_ID 0x6666
int createShm(int size);//create
int destroyShm(int shmid);//destroy
int getShm(int size);//get
//创建一段共享内存,并获取其 标识码
static int commShm(int size ,int flags)
{
key_t key = ftok(".",0x1);
if(key < 0)
{
perror("ftok");
return -1;
}
int shmid ;
if((shmid = shmget(key, size, flags)) < 0)
{
perror("shmid");
return -2;
}
return shmid;
}
int destroy(int shmid)
{
if(shmctl(shmid,IPC_RMID,NULL) < 0) //IPC_RMID 标记要销毁的内存段
{
perror("shmctl");
return -3;
}
return 0;
}
//调用创建函数 创建共享内存
int createShm(int size)
{
return commShm(size,IPC_CREAT |IPC_EXCL |0666);//size + flag //excl 保证shmid标识的内存段 存在的情况下 创建失败
}
//存在共享内存 就获取 shmid
int getShm(int size)
{
return commShm(size,IPC_CREAT);
}
server.cpp
#include "comm.hpp"
#include <unistd.h>
int main()
{
int shmid = createShm(4096);//出错就会在 函数内部报错
char* addr =(char*) shmat(shmid,NULL,0);//将 shm 连接到 进程地址空间
int i =0;
while(i++ <26)
{
if(addr)
printf("client addr: %s\n",addr); // 依次读取addr 开始的共享内存的数据
sleep(1);
}
shmdt(addr);
sleep(2);
destroy(shmid);
return 0;
}
client.cpp
#include "comm.hpp"
#include <unistd.h>
int main()
{
int shmid = getShm(4096);//获取共享内存的 标识码 同样出错 在函数内部就会报错出来
sleep(1); //模拟 获取过程
char* addr = (char*) shmat(shmid,NULL,0);//将共享内存连接到进程地址空间
sleep(2);
int i = 0;
while(i < 26)
{
addr[i] = 'A' + i;//我们测试26个大写字母
i++;
addr[i] = 0;
sleep(1);
}
shmdt(addr);
sleep(2);
return 0;
}