1. 文件映射的应用场景
  2. 进程间共享信息
  3. 实现文件数据从磁盘到内存的映射,极大的提升应用程序访问文件的速度

mmap函数

头文件:#include<sys/mman.h>

函数原型

void *mmap(void *addr, size_t length, int port, int flags,int fd, off_t offset);

int munmap(void *addr, size_t length);

参数

@addr:指向欲映射的内存起使地址。通常设为NULL,代表让系统自动选择地址,映射成功后返回该地址

@length:代表将文件中多大的部分映射到内存

@port:映射区域的保护方式。 可以是下列方式的组合:

PORT_EXEC  -->执行

PORT_READ  -->读取

PORT_WRITE  -->写入

PORT_NONE  -->不能存取

@flags:影响映射区域的各种特性。必须要指定MAP_SHARED 或 MAP_PRIVATE

MAP_SHARED     - 映射区域数据与文件对应,允许其他进程共享

MAP_PRIVATE    - 映射区域生成文件的copy,修改不同步文件

MAP_ANONYMOUS  - 建立匿名映射。此时会忽略参数fd,不涉及文件,而且映射区域无法和其他进程共享。

MAP_DENYWRITE  - 允许对映射区域的写入操作,其他对文件直接写入的操作将会被拒绝。

MAP_LOCKED     - 将映射区域锁定住,这表示该区域不会被置swap

@fd:要映射到内存中的文件描述符。如果使用匿名内存映射时,即flags中设置了MAP_ANONYMOUS,fd设为-1。有些系统不支持匿名内存映射,则可以使用fopen打开/dev/zero文件,然后对该文件进行映射,可以同样达到匿名内存映射的效果。

@offset:文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍。

返回值

如果映射成功,则返回指向映射的内存地址的指针

msync函数:实现磁盘文件内容与共享内存区的内容一致,即同步操作.

头文件:#include <sys/mman.h>

函数原型:int msync(void *addr, size_t length, int flags);

参数:

@addr :文件映射到进程空间的地址

@len:映射空间的大小

@flags:刷新的参数设置,

MS_ASYNC  ->异步,调用会立即返回,不等到更新的完成

MS_SUNC  ->同步,调用会等待更新完成之后返回

返回值:

成功返回 0 ,失败返回 -1

    函数mremap:  扩大(或缩小)现有的内存映射
    
    函数原型
    Void* mremap(void *old_address, size_t old_size,size_t new_size,int flags);
    
    头文件
    #include<unistd.h>
    #include<sys/man.h>
    
    参数
    @addr : 上一次已经映射到进程空间的地址
    @old_size :旧空间的大小
    @new_size : 重新映射指定的新空间的大小
    @flags:取值可以为 0 或MREMAP_MAYMOVE, 0代表不允许内核移动映射区域,
    MREMAP_MAYMOVE 则表示内核可以根据实际情况移动映射区域以找到一个
    符合new_size大小要求的内存区域
    
    返回值:成功返回指向新的内存地址的指针,失败则返回 MAP_FAILED

Logo

更多推荐