存储映射I/O(UNIX环境高级编程笔记)

  存储映射I/O(memory-mapped I/O)能将一个磁盘文件映射到存储空间的一个缓冲区上,当从缓冲区中取数据时,就相当于读文件中的相应字节。与此类似,将数据存入缓冲区时,相应字节就自动写入文件。
  为了使用这种功能,应首先高数内核将一个给定的文件映射到一个存储区域中。这是用mmap函数实现的。

#include <sys/mman.h>
void *mmap(void *addr, size_t len, int port, int flag, int fd, off_t off);
            返回值:若成功,返回映射区的起始地址;若出错,返回MAP_FAILED

  addr参数用于指定映射存储区的起始地址。置0时由四通选择起始地址。
  fd参数是指定要被映射文件的描述符。在文件映射到地址空间之前,必须先打开该文件。len参数是映射的字节数,off是要映射字节在文件中的起始偏移量。
  prot参数指定了映射存储区的保护要求。
  下图显示了一个存储映射文件。
存储映射I/O(UNIX环境高级编程笔记)
  off的值和addr的值通常被要求是系统虚拟存储页长度的倍数。
  不能用mmap将数据追加到文件中,必须先加长改文件。
  调用mprotect可以更改一个现有映射的权限。

#include <sys/mman.h>
int mprotect(void *addr, size_t len, int prot);
                返回值:若成功,返回0;若出错,返回-1

  如果共享映射中的页已修改,那么可以调用msync将该页冲洗到被映射的文件中。msync函数类似于fsync,但作用于存储映射区。

#include <sys/mman.h>
int msync(void *addr, size_t len, int flags);
                返回值:若成功,返回0;若出错,返回-1

  当进程终止时,会自动解除存储区中的映射,或者直接调用munmap函数也可以解除映射区。关闭映射存储区时使用的文件描述符并不解除映射区。

#include <sys/mman.h>
int munmap(void *addr, size_t len);
                返回值:若成功,返回0;若出错,返回-1