linux的mmap函数

mmap函数用于将文件直接映射到进程的虚拟内存,允许进程通过内存操作实现文件的读写,避免了read/write函数的调用,涉及虚拟内存技术和零拷贝概念。示例代码展示了如何使用mmap打开并修改文本文件。
摘要由CSDN通过智能技术生成

1 mmap函数作用

将文件在磁盘上的位置直接映射到进程虚拟内存区域,那么进程在对该虚拟内存区域进行操作时就好像直接进行了文件的读写操作,不需要调用read和weite函数(虚拟内存技术和零拷贝)

2 相关函数

#include<unistd.h>
#include<sys/mman.h>
/*
* start指定地址,一般为NULL,由内核自定
* lenth建立的虚拟内存大小,如果要追加,最好大于文件大小
* port 区域读写权利
* flag 映射对象标志
* fd映射的文件描述符
* offset偏移  0
* 返回虚拟地址首地址
*/
void *mmap(void* start,size_t lenth,int port,int flag,int fd,off_t offset);
int munmap(void* start,size_t lenth);//进程释放该虚拟内存

3 实例

#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
{
    struct stat stat;
    int fd =  open("text.txt", O_RDWR) ;
    cout << fd << endl;
    cout << fstat(fd, &stat) << endl;
    char* ptr = NULL;
    ptr = (char*)mmap(NULL, 100, PROT_READ| PROT_WRITE, MAP_SHARED,fd, 0);
    printf("读取到的:%s\n", ptr);
    memcpy(ptr, "hello hello", 100);
    printf("再次读取到的:%s\n", ptr);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux系统中,mmap函数用于将文件或设备映射到进程的虚拟地址空间,实现对文件或设备的直接访问。mmap函数的原型如下: ```c void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); ``` 参数说明: - `addr`:映射的起始地址,一般为NULL,表示由系统自动选择合适的地址。 - `length`:映射的长度,以字节为单位。 - `prot`:映射区域的保护方式,可以是`PROT_NONE`(无权限)、`PROT_READ`(可读)、`PROT_WRITE`(可写)、`PROT_EXEC`(可执行)的组合。 - `flags`:映射选项,可以是`MAP_SHARED`(共享映射)、`MAP_PRIVATE`(私有映射)、`MAP_ANONYMOUS`(匿名映射)等的组合。 - `fd`:要映射的文件描述符,如果是匿名映射,则为-1。 - `offset`:映射的文件偏移量,以字节为单位。 mmap函数返回映射区域的起始地址,如果映射失败,则返回MAP_FAILED。 使用mmap函数可以实现以下功能: - 文件映射:将文件映射到内存中,可以直接通过内存访问文件内容。 - 共享内存:通过共享映射,多个进程可以共享同一块内存区域,实现进程间通信。 - 匿名映射:创建一个只存在于内存中的映射区域,不与文件关联,常用于进程间通信和共享内存。 需要注意的是,使用mmap函数进行内存映射操作需要谨慎处理,确保对映射区域的访问不会越界或导致意外的行为。同时,在使用完映射区域后,应及时使用munmap函数进行解除映射操作,释放相关资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值