内存映射区

1、mmap - 创建内存映射区

  • 作用:将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件
  • 函数原型:
void *mmap(
    void *adrr,      //映射区首地址,传NULL
    size_t length,   //映射区的大小,不能为0,文件多大,length多大
    int port,        //映射区权限,PORT_EXEC、
                                  PORT_READ -- 映射区必须要有读权限
                                  PORT_WRITE、
                                  PORT_NONE
    int flags,       //标志位参数,MAP_SHARED -- 修改了内存数据会同步到磁盘
                                  MAP_PRIVATE --修改了内存数据不会同步到磁盘
    int fd,          //文件描述符,被映射的文件对应的文件描述符,通过open()得到
    off_t offset,    //映射文件的偏移量。映射的时候文件指针的偏移量,必须是4k的整数倍
);
  • 返回值:映射区的首地址--调用成功;返回(void *)-1 -- 调用失败

2、munmap - 释放内存映射区

  • 函数原型
int munmap(
    void *addr,    //mmap的返回值,映射区的首地址 
    size_t length  //映射区的首地址
);

3、示例

# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <fcntl.h>
# include <sys/stat.h>
# include <sys/types.h>
# include <sys/mman.h>

int main()
{
    int fd = open("/home/FUJIA/cy1706/practice/english.sh",O_RDONLY | O_WRONLY);
    if(fd == -1)
    {
        printf("open error");
        exit(0);
    }
    int len = lseek(fd,0,SEEK_END);
    printf("%d\n",len);
    void *ptr = mmap(NULL,len,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
    if(ptr == MAP_FAILED);
    {
        perror("mmap error");
        exit(1);
    }
    //printf("%s",(char *)ptr);

    munmap(ptr,len);
    close(fd);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值