内存映射区

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;
}

猜你喜欢

转载自blog.csdn.net/qq_41727218/article/details/81407541
今日推荐