linux下如何用C++实现虚拟内存的创建和管理。
如题,我试了几种方法,用共享内存的方式 创建老时创建失败。
#ifndef WIN32#ifndef SHM_R#define SHM_R (256) //共享内存只读#endif#ifndef SHM_W #define SHM_W (128) //共享内存只写#endif#ifndef SHM_OPEN#define SHM_OPEN (SHM_R | SHM_W | SHM_R >> 3 | SHM_W >> 3 | SHM_R >> 6 | SHM_W >> 6) //打开共享内存,如果不存在则出错#endif#ifndef SHM_CREATE#define SHM_CREATE (SHM_OPEN | IPC_CREAT) //建立共享内存,如果已存在则出错#endif#include <sys/types.h>#include <sys/shm.h>#endifclass yCShm{public: yCShm () { m_nShmID = 0; } //析构函数 ~yCShm () { } public: int Create (const char *pIPCName, int nShmSize) { key_t key = ftok (pIPCName, 0x111); if (key < 0) { printf("create shm 1\r\n"); return 0; } if ((m_nShmID = shmget (key, nShmSize, SHM_CREATE)) == -1) { if ((m_nShmID = shmget (key, nShmSize, SHM_OPEN)) == -1) { m_nShmID = 0; printf("create shm 2\r\n"); return 0; } } printf("create shm 3\r\n"); return 1; } int Drop () { if (m_nShmID != 0) { shmctl (m_nShmID, IPC_RMID, NULL); m_nShmID = 0; } return 1; } void *Shmat ( const void * pAddr=0, int nFlag=0) { void *pointer = NULL; pointer = (void *) shmat (m_nShmID, pAddr, nFlag); if (pointer == ((void *) -1)) pointer = NULL; return pointer; }private: int m_nShmID; //共享内存ID char shm_name[50]; //共享内存映射文件名(也就是Create的第一个参数)};int main(int argc, char* argv[]){ yCShm rshm; rshm.Create("./temp",1); rshm.Create("./temp",1024*1024); void *p=rshm.Shmat(0,0); if(p) { printf("create shm succ\r\n"); } else { printf("create shm fail\r\n"); } getchar(); rshm.Drop(); return 0;}