长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 文件操作

    • Linux文件属性
    • 文件操作
    • 文件操作举例
    • 目录操作
    • 获得目录列表
    • 内存映射
      • 内存映射文件
      • mmap函数
        • mmap函数的参数
      • munmap函数
      • fstat函数
        • struct stat结构
    • 内存映射举例
  • Linux进程和线程

  • Linux信号

  • 进程间通信

  • Socket

  • C语言
  • 文件操作
DC Wang
2023-02-16
目录

内存映射

# 内存映射

# 内存映射文件

  • Linux允许任何进程把一个磁盘文件映射到内存中,在磁盘文件和它在内存 中的映射间创建逐字节对应的关系。

  • 内存映射文件的优点

    • 相对于到磁盘上存取文件来说速度快

    • 可以在内存中共享数据

  • Linux提供一系列调用管理内存映射,应用于framebuffer等场合。

# mmap函数

mmap函数用来建立一个磁盘文件的内存映射,返回指向此内存首地址的指针。

#include <unistd.h>
#include <sys/mman.h>
void* mmap(void* start, size_t length,
           int prot, int flags, int fd, off_t offset);
1
2
3
4

# mmap函数的参数

  • start:指向欲对应的内存起始地址,通常设为NULL,代表让系统自动选定

    地址,对应成功后该地址会返回。

  • length:将文件中多大的部分映射到内存。

  • prot:映射区域的保护方式,有下列组合:

    • PROT_EXEC 映射区域可被执行
    • PROT_READ 映射区域可被读取
    • PROT_WRITE 映射区域可被写入
    • PROT_NONE 映射区域不能访问
  • flags:影响映射区域的各种特性:

    • MAP_SHARED:对映射区域的写入数据会复制回文件,且允许其他映

      射该文件的进程共享。

    • MAP_PRIVATE:对映射区域的写入操作会产生一个映射文件的复制,

    对此区域作的任何修改都不会写回原来的文件内容。

  • fd:为open()返回的文件描述符,代表欲映射到内存的文件。

  • offset:参数offset为文件映射的偏移量,通常设置为0,代表从文件最前方

    开始对应,offset必须是分页大小的整数倍。

# munmap函数

  • munmap函数用来取消参数start所指的映射内存起始地址,参数length则是

    欲取消的内存大小。

  • 当进程结束或利用exec相关函数来执行其他程序时,映射内存会自动解除,

    但关闭对应的文件描述符时不会解除映射。成功返回0,否则返回-1,

    错误原因存于errno中。

#include<unistd.h>
#include<sys/mman.h>
int munmap(void *start,size_t length);
1
2
3

# fstat函数

  • fstat函数用来将文件描述符fildes所指的文件的状态,复制到参数buf所指的

    结构中(struct stat)。执行成功则返回0,失败返回-1,错误代码存于errno。

#include<sys/stat.h>
#include<unistd.h>
int fstat(int fildes, struct stat *buf);
1
2
3

# struct stat结构

struct stat
{
    dev_t st_dev; /*文件的设备编号 */
    ino_t st_ino; /*文件的inode */
    mode_t st_mode; /*文件的类型和存取的权限 */
    nlink_t st_nlink; /*连到该文件的硬连接数目 */
    uid_t st_uid; /*文件所有者的用户识别码 */
    gid_t st_gid; /*文件所有者的组识别码 */
    dev_t st_rdev; /*若此文件为装置设备文件,则为其设备编号 */
    off_t st_size; /*文件大小,以字节计算 */
    unsigned long st_blksize; /*文件系统的I/O缓冲区大小 */
    unsigned long st_blocks; /*占用文件区块的个数 */
    time_t st_atime; /* time of lastaccess */
    time_t st_mtime; /* time of last modification */
    time_t st_ctime; /* time of last change */
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
编辑 (opens new window)
#C#Linux#文件操作
上次更新: 2023/02/18, 10:09:42
获得目录列表
内存映射举例

← 获得目录列表 内存映射举例→

最近更新
01
ESP32-网络摄像头方案
06-14
02
ESP32-PWM驱动SG90舵机
06-14
03
ESP32-实时操作系统freertos
06-14
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式