做弹弓教程网站,广州黄埔建网站,那些企业需要做网站,做网站的必要条件共享内存的概念#xff1a; 操作系统通过页表将共享内存的起始虚拟地址映射到当前进程的地址空间中共享内存是由需要通信的双方进程之一来创建但该资源并不属于创建它的进程#xff0c;而属于操作系统 共享内存可以在系统中存在多份#xff0c;供不同个数#xff0c;不同进…共享内存的概念 操作系统通过页表将共享内存的起始虚拟地址映射到当前进程的地址空间中共享内存是由需要通信的双方进程之一来创建但该资源并不属于创建它的进程而属于操作系统 共享内存可以在系统中存在多份供不同个数不同进程进行通信因此共享内存一定会存在一个数据结构来对共享内存进行管理共享内存内存空间数据共享内存的属性 共享内存的相关接口 key由用户形成具有唯一性内核区分shm的唯一性的内核使用的一个字段用户不能用Key来进行shm的管理size共享内存的大小shmflg标记位可以用位图传参认识它中的两个宏IPC_CREAT和IPC_EXCL IPC_CREAT创建的共享内存不存在就创建存在则获取该共享内存并返回IPC_CREAT|IPC_EXCL创建的共享内存不存在就创建存在则出错返回IPC_EXCL单独使用没有意义 共享内存不随着进程的结束就释放因为共享内存不属于进程而属于操作系统需要手动释放或者后续其它系统调用。共享内存的生命周期随内核。 查共享内存的命令
ipcs -m删除共享内存的命令
ipcrm -m shmid 共享内存测试代码
#ifndef __SHM_HPP__
#define __SHM_HPP__
#include iostream
#include cerrno
#include cstdio
#include sys/ipc.h
#include sys/shm.h
#include unistd.h
const std::string pathname /home/dl/pipe/shm;
int proj_id 0x66;
const int Creater 1;
const int User 2;
const int CreatShmsize4096;class shm
{
private:// 获取共享内存int GetShmhelper(key_t key, int size, int flag){int shmid shmget(key, size, flag);if (shmid 0){perror(shmget);}return shmid;}//获取Keykey_t GetcommKey(){key_t k ftok(_pathname.c_str(), _proj_id);if (k 0){perror(ftok);}return k;}
private:key_t _key;int _shmid;std::string _pathname;int _proj_id;int _who;
public:shm(const std::string pathname, int proj_id, int who): _pathname(pathname),_proj_id(proj_id), _who(who){_keyGetcommKey();//获取共享内存都需要该参数因此直接在构造时生成即可std::coutshmid:_shmidstd::endl;std::coutkey:TOHex(_key)std::endl;std::coutwho:_whostd::endl;}~shm(){if(_whoCreater){int resshmctl(_shmid,IPC_RMID,nullptr);std::coutshm remove donestd::endl;}}std::string TOHex(key_t key){char buffer[128];snprintf(buffer, sizeof(buffer), 0x%x, key);return buffer;}bool GetShmCreater(){//判断是否为创建者if(_whoCreater){int shmid GetShmhelper(_key,CreatShmsize,IPC_CREAT|IPC_EXCL);if(shmid0)std::coutshm creat donestd::endl;sleep(5);return true;}return false;}bool GetShmUse(){//判断是否为使用者if(_whoUser){int shmid GetShmhelper(_key,CreatShmsize,IPC_CREAT);if(shmid0)std::coutshm get donestd::endl;return true;}return false;}};#endif