System V共享内存实现进程间通信
#ifndef __11_SHM_HPP__
#define __11_SHM_HPP__
#include<iostream>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
using namespace std;
const char *pathname = "./";
const int PROJ_ID = 0x6664;
inline int error(const char *errstr)
{
printf("%s\n", errstr);
return -1;
}
class sharememory
{
private:
int shmid;
int _getshm(int _shmflg, int _memsize)
{
key_t _key;
if ((_key = ftok(pathname, PROJ_ID)) < 0)
error("ftok");
int _shmid;
if ((_shmid = shmget(_key, _memsize, _shmflg)) < 0)
error("shmget");
return _shmid;
}
public:
sharememory();
sharememory(int _shmflg, int _memsize);
~sharememory();
int getShmid();
int getSharememoryid(int _shmflg, int _memsize);
void *getmemory(int shmid);
void destroySharememory();
void detachSharememory(void *shm_addr);
};
sharememory::sharememory()
{
shmid = -1;
}
sharememory::sharememory(int _shmflg, int _memsize)
{
shmid = _getshm(_shmflg, _memsize);
}
sharememory::~sharememory()
{}
int sharememory::getShmid()
{
return shmid;
}
int sharememory::getSharememoryid(int _shmflg, int _memsize)
{
return (shmid = _getshm(_shmflg, _memsize));
}
void *sharememory::getmemory(int _shmid)
{
return shmat(_shmid, NULL, 0);
}
void sharememory::destroySharememory()
{
if (shmid == -1)
return;
if (shmctl(shmid, IPC_RMID, NULL) < 0)
error("shmctl");
}
void sharememory::detachSharememory(void *shm_addr)
{
shmdt(shm_addr);
}
#endif
server.cpp
#include "11-shm.hpp"
int main(int argc, char *argv[])
{
sharememory sm(IPC_CREAT | IPC_EXCL | 0666, 1024);
char *shm_addr = (char *)sm.getmemory(sm.getShmid());
strcpy(shm_addr, "okokokk");
sleep(20);
sm.destroySharememory();
sm.detachSharememory(shm_addr);
return 0;
}
client.cpp
#include "11-shm.hpp"
int main(int argc, char *argv[])
{
sharememory sm;
int shmid = sm.getSharememoryid(IPC_CREAT, 1024);
char *shm_addr = (char *)sm.getmemory(shmid);
printf("%s\n", shm_addr);
sleep(5);
sm.destroySharememory();
sm.detachSharememory(shm_addr);
return 0;
}