来自http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=213
POSIX 标头包括内存映射系统调用和数据结构。因为这个界面比 Windows 的界面更直观、更简单,所以我的内存映射示例基于 POSIX 库。
mmap() 系统调用:
caddr_t mmap(caddress_t map_addr,
size_t length,
int protection,
int flags,
int fd,
off_t offset);
让我们检查每个参数的含义。
在以下示例中,程序将命令行中传递的文件的前 4 KB 映射到其内存中,然后从中读取 int 值:
#include <errno.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
int fd;
void * pregion;
if (fd= open(argv[1], O_RDONLY) <0)
{
perror("failed on open");
return –1;
}
/*map first 4 kilobytes of fd*/
pregion=mmap(NULL, 4096, PROT_READ,MAP_SHARED,fd,0);
if (pregion==(caddr_t)-1)
{
perror("mmap failed")
return –1;
}
close(fd); //close the physical file because we don't need it
//access mapped memory; read the first int in the mapped file
int val= *((int*) pregion);
}
要取消映射映射区域,请使用 munmap() 函数:
int munmap(caddr_t addr, int length);
addr 是未映射区域的地址。长度指定应该取消映射多少内存(您可以取消映射先前映射区域的一部分)。以下示例取消映射先前映射文件的第一个千字节。在此调用之后,剩余的 3 KB 仍然映射到进程的 RAM:
munmap(pregion, 1024);