LinuxC/C++程式設計(9)—對映記憶體
阿新 • • 發佈:2019-02-11
簡單來說,對映記憶體,就是建立硬碟檔案到程序地址空間的對映,在程序中讀寫這段對映記憶體,可以向硬碟檔案中直接同步。
利用這點,對映記憶體也可以像共享記憶體一樣,用來進行不同程序之間的通訊。(但共享記憶體的效率較高,因為不需要任何複製粘帖操作,而對映記憶體,所產生的只是記憶體到硬碟中的一個對映,所以比較節省記憶體開銷,可以建立一個空間很大的對映記憶體區來滿足程序間通訊的要求)
利用這點,對映記憶體也可以像共享記憶體一樣,用來進行不同程序之間的通訊。(但共享記憶體的效率較高,因為不需要任何複製粘帖操作,而對映記憶體,所產生的只是記憶體到硬碟中的一個對映,所以比較節省記憶體開銷,可以建立一個空間很大的對映記憶體區來滿足程序間通訊的要求)
記憶體對映是Linux中一種很有特色的機制,有空再更一下原理,先貼示例程式碼:
#include <iostream> #include <unistd.h> #include <sys/mman.h> #include <sys/sem.h> #include <sys/fcntl.h> #include <string.h> using namespace std; int main() { string path = "test"; int fd; if ((fd = open(path.c_str(), O_RDWR | O_CREAT, S_IRWXU)) == -1) { cerr << "open file fail!" << endl; return -1; } lseek(fd, 100, SEEK_SET);//lseek可以讓檔案產生“空洞” write(fd, "", 1); lseek(fd, 0, SEEK_SET); char *fileMemory; if ((fileMemory = (char*)mmap(0, 100, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0)) == NULL) //建立一個4096位元組的對映記憶體 { cerr << "create mmap fail!" << endl; return -1; } if (close(fd) == -1) //建立對映記憶體完畢,必須觀賞檔案描述符 { cerr << "close file fail!" << endl; return -1; } char test[10] = "heiheihei"; strcpy(fileMemory, test); if (munmap(fileMemory, 100) == -1) { cerr << "munmap fail!" << endl; return -1; } return 0; }