1. 程式人生 > >LinuxC/C++程式設計(9)—對映記憶體

LinuxC/C++程式設計(9)—對映記憶體

簡單來說,對映記憶體,就是建立硬碟檔案到程序地址空間的對映,在程序中讀寫這段對映記憶體,可以向硬碟檔案中直接同步。
利用這點,對映記憶體也可以像共享記憶體一樣,用來進行不同程序之間的通訊。(但共享記憶體的效率較高,因為不需要任何複製粘帖操作,而對映記憶體,所產生的只是記憶體到硬碟中的一個對映,所以比較節省記憶體開銷,可以建立一個空間很大的對映記憶體區來滿足程序間通訊的要求)

記憶體對映是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;
}