linux进程通信/异常处理

在使用共享内存的时,有时候程序异常结束,导致共享内存没有被释放,进而导致程序重新运行无法使用共享内存通信。
提示信息为 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;
}

在这里插入图片描述

发布了90 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44030580/article/details/104092811