`
jjw
  • 浏览: 65496 次
文章分类
社区版块
存档分类
最新评论

linux下文件映射函数mmap

阅读更多

linux下的mmap函数允许直接把文件映射到内存,对文件的所有操作可以直接使用访问内存一样来操作
因为指定的是文件的地址,所以根据参数可以知道,mmap可以只映射文件的一个片段,而不需要映射整个文件
mmap将整个文件映射到内存,不是地址,而是整个文件的数据都映射到内存,对内存数据的操作都可能对原始文件本身的内容进行同步,通过msync可以保证同步。优点是:
1. 性能更佳,文件数据本来放在磁盘上,现在全部放在内存
2. 操作方便,通过指针直接进行数据的操作,如:(int*) pint = (int*)mmapfile("./a.txt"); printf("%d",pint[0]);
3. 进程间数据共享,两个进程对同一个文件进行映射,可以达到进程间数据通讯的目的

mmap所在的头文件
       #include <sys/mman.h>
函数原型
       void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
参数:
  start:映射区的开始地址。
  length:映射区的长度。
  prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起
  PROT_EXEC //页内容可以被执行
  PROT_READ //页内容可以被读取
  PROT_WRITE //页可以被写入
  PROT_NONE //页不可访问
  flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个以下位的组合体
  MAP_FIXED //使用指定的映射起始地址,如果由start和len参数指定的内存区重叠于现存的映射空间,重叠部分将会被丢弃。如果指定的起始地址不可用,操作将会失败。并且起始地址必须落在页的边界上。
  MAP_SHARED //与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到msync()或者munmap()被调用,文件实际上不会被更新。
  MAP_PRIVATE //建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。这个标志和以上标志是互斥的,只能使用其中一个。
  MAP_DENYWRITE //这个标志被忽略。
  MAP_EXECUTABLE //同上
  MAP_NORESERVE //不要为这个映射保留交换空间。当交换空间被保留,对映射区修改的可能会得到保证。当交换空间不被保留,同时内存不足,对映射区的修改会引起段违例信号。
  MAP_LOCKED //锁定映射区的页面,从而防止页面被交换出内存。
  MAP_GROWSDOWN //用于堆栈,告诉内核VM系统,映射区可以向下扩展。
  MAP_ANONYMOUS //匿名映射,映射区不与任何文件关联。
  MAP_ANON //MAP_ANONYMOUS的别称,不再被使用。
  MAP_FILE //兼容标志,被忽略。
  MAP_32BIT //将映射区放在进程地址空间的低2GB,MAP_FIXED指定时会被忽略。当前这个标志只在x86-64平台上得到支持。
  MAP_POPULATE //为文件映射通过预读的方式准备好页表。随后对映射区的访问不会被页违例阻塞。
  MAP_NONBLOCK //仅和MAP_POPULATE一起使用时才有意义。不执行预读,只为已存在于内存中的页面建立页表入口。
  fd:有效的文件描述词。如果MAP_ANONYMOUS被设定,为了兼容问题,其值应为-1。
  offset:被映射对象内容的起点。

 

例子:

void * mmapfile(const char* file) {
        int filehandle;
        if ((filehandle = open(file, O_RDWR| O_CREAT, S_IRWXU)) < 0){
                printf("open file wrong!");
                exit(1);

        }     
        struct stat file_stat;
        if (fstat(filehandle, &file_stat) < 0) {
                printf("fstat wrong");
                exit(1);
        } 

        printf("%s file size:%d\n", file, file_stat.st_size);
        void* sfp;
        if((sfp = mmap(NULL, file_stat.st_size, PROT_READ|PROT_WRITE,MAP_SHARED, filehandle, 0)) == MAP_FAILED)
        { 
                printf("mmap wrong!");
                exit(0);

        }
        return sfp;
}

 
通过 msync 函数可以保证内存数据对文件磁盘里的数据的保持更新

 

分享到:
评论

相关推荐

    linux下的内存映射函数mmap详解及示例代码

    Linux下的内存映射函数mmap详解及示例代码 Linux下的内存映射机制mmap是Linux内核中的一种机制,允许进程将文件映射到自己的地址空间中,从而实现文件I/O操作。该机制是基于虚拟存储(Virtual Memory,VM)概念的,...

    linux下的内存映射函数mmap详解及示例代码.pdf

    Linux下的内存映射函数mmap详解及示例代码.pdf 本文档将详细介绍Linux下的内存映射函数mmap,包括其概念、实现机制、示例代码等方面的内容。 mmap概念 mmap是Linux操作系统中的一种内存映射机制,可以将文件映射...

    linux下文件映射函数

    ### Linux 下文件映射函数(mmap)详解 #### 一、引言 在 Linux 操作系统中,`mmap` 函数是一个非常强大的工具,它允许用户将文件或者对象直接映射到进程的虚拟地址空间。这不仅提高了数据访问的速度,同时也简化...

    linux下的内存映射函数mmap详解及示例代码.doc

    Linux下的内存映射函数mmap详解及示例代码 内存映射(Memory Mapping)是一种将文件映射到进程地址空间的机制,允许进程直接访问文件,而不需要使用传统的read和write系统调用,这种机制可以提高文件访问的效率和...

    Linux下文件映射实现分析

    ### Linux下文件映射实现分析 #### 前言 在深入探讨Linux内核中文件映射的实现之前,我们先简要回顾一下文件映射的基本概念及其在Linux环境下的重要性。文件映射,简单来说,就是将一个或多个文件的全部或部分虚拟...

    linux mmap文件内存映射机制

    ### Linux mmap 文件内存映射机制详解 #### 一、引言 `mmap`系统调用作为Linux系统中一种重要的内存管理和文件访问机制,在实际应用中具有广泛的应用场景。它不仅提高了程序对文件数据的访问效率,还为进程间通信...

    GPIO.rar_GPIO_linux mmap gp_mmap_mmap gpio_mmap gpio 50c

    "GPIO.rar_GPIO_linux mmap gp_mmap_mmap gpio_mmap gpio 50c"这个压缩包文件显然关注的是Linux环境下如何使用mmap函数来操作GPIO。 Linux中的mmap(Memory-Mapped I/O)是一种高效的数据传输方式,它允许用户空间...

    linux-char-driver-by-mmap.zip_linux mmap_mmap

    字符驱动的mmap函数负责处理这个请求,设置映射关系,并返回一个文件描述符,用户进程可以通过这个描述符访问设备内存。 以下是一个简单的mmap函数的步骤概述: 1. **初始化设备**: 驱动程序在初始化时需要为设备...

    通过文件映射,进程间通信demo

    2. **映射文件**:主进程和子进程分别调用MapViewOfFile/mmap将文件映射到各自的地址空间。映射的区域应是相同的,这样它们才能访问同一份数据。 3. **通信**:主进程或子进程修改映射区域的数据,这些更改对其他...

    文件映射封装类

    在Linux中,文件映射功能是通过`mmap`系统调用实现的。这个调用可以将文件或匿名内存区域映射到进程的虚拟地址空间。因此,`mymmapu.cpp`很可能实现了`mmap`的封装,而`mymmapu.h`则包含相应的类定义和声明。 在...

    mmap测试例程应用实例

    内存映射(mmap)是Linux系统中一种高效的数据访问技术,它允许程序直接通过内存地址来访问文件,而无需经过传统的I/O操作。这种方式极大地优化了大文件处理的性能,因为它减少了磁盘I/O的次数,提高了数据的吞吐量...

    Linux设备驱动之内存映射

    在Linux环境下,内核提供了一套完整的机制来支持这种映射操作,主要通过mmap()函数实现。 #### 三、mmap()函数详解 在Linux中,mmap()函数允许进程将一个文件或者设备文件映射到其地址空间中。当应用程序通过设备...

    磁盘文件映射内存映射

    在Windows系统中,可以使用`CreateFileMapping`函数创建一个映射对象,然后使用`MapViewOfFile`函数将文件映射到进程的地址空间。在Linux系统中,可以使用`mmap`系统调用来完成同样的操作。 例如,在Linux中,创建...

    linux中mmap总结

    Linux中的mmap(内存映射)是一种高效的数据访问机制,它允许将文件或者其他对象直接映射到进程的虚拟内存空间中,使得程序可以直接通过内存访问这些数据,而无需调用read和write等I/O函数。这种方法可以提高I/O操作...

    映射文件操作封装类

    1. **create**:通过调用`CreateFileMapping`(Windows)或`shm_open`/`mmap`(Linux)创建一个新的映射文件。如果文件已存在,可以选择覆盖或追加模式。 2. **open**:使用`OpenFileMapping`(Windows)或`shm_open...

    Linux 常用C函数

    8. **内存映射函数**:如`mmap`,它允许程序直接将文件映射到内存空间,提高了大文件处理的效率。 9. **进程控制函数**:如`fork`、`execve`、`waitpid`,它们用于创建新的进程,执行新的程序以及等待子进程结束。 ...

    Linux共享内存实例及文件映射编程及实现原理.pdf

    - `mmap()`函数将磁盘文件映射到内存区域,提供无`read/write`操作的I/O方式。 - 地址参数`addr`可指定映射起始位置,通常设为0让系统自动选择。 - `len`指明映射长度,`off`为文件内偏移量,`fd`是文件描述符。 ...

    linux用户进程内存映射

    do_mmap_pgoff 函数是 do_mmap 函数的核心函数,它负责将文件或匿名映射到进程的地址空间中。它的参数包括 file、addr、len、prot、flags 和 pgoff 六个参数: * file:文件描述符。 * addr:指定从哪里开始查找...

    内存映射修改大文件_内存映射_MemoryFile_超大文件读写_

    在Linux中,相应的系统调用是mmap。这两个API都允许程序员指定文件的哪一部分映射到内存,以及映射的大小。一旦映射完成,程序就可以通过指针直接访问这些区域,就像它们是普通内存一样。 内存映射的一个关键优点是...

    Linux设备驱动之mmap设备操作

    mmap 是一种用于将文件或设备映射到进程地址空间的重要系统调用。通过这种方式,用户可以直接对映射区域进行读写操作,从而达到对文件或设备进行访问的目的,避免了传统 read 和 write 操作的频繁调用。 **函数原型...

Global site tag (gtag.js) - Google Analytics