当前位置:首页 > 编程笔记 > 正文
已解决

内存的映射

来自网友在路上 166866提问 提问时间:2023-09-24 04:25:16阅读次数: 66

最佳答案 问答题库668位专家为你答疑解惑

#include <sys/mman.h>

       void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

       功能:将一个文件或者设备的数据映射到内存中

       参数:

        -void *addr:NULL,由内核指定

        -length:要映射的数据的长度,这个值不能为0.建议使用文件的长度

            可以使用stat、 lseek函数获取文件的长度

        -prot:对申请的内存映射区的操作权限

            -PROT_EXEC:可执行的权限

            -PROT_READ:读权限

            -PROT_WRITE:写权限

            -PROT_NULL:没有权限

            要操作映射内存,必须要有读的权限

            PROT_WRITE | PROT_READ、PROT_READ

        -flags:

            -MAP_SHARED:映射区的数据会自动和磁盘文件进行同步,进程间通信,必须要设置这个选项

            _PRIVATE:不同步,内存映射区的数据变了,对原来的文件不会修改,会重新创建一个新的文件。(copy on write)

        -fd:文件描述符,通过open得到  注意:文件的大小不能为0   open指定的权限不能喝prot参数有冲突

        -offset:偏移量,一般不用,必须是4K的整数倍,0表示不偏移

        返回值:成功返回创建的内存的首地址,失败返回(void *) -1

       int munmap(void *addr, size_t length);

        功能:释放内存映射

        参数:

            -addr:要释放的内存的首地址

            -length:要释放的内存大小,要和mmap函数length参数一致

注意

使用内存映射实现进程间通信:

    1.有关系的进程(父子进程)

        -还没有子进程的时候

            -通过唯一的父进程,先创建内存映射区,有了内存映射区以后,创建子进程,父子进程共享创建的内存映射区

    2.没有关系的进程间通信

        -准备一个大小不是0的磁盘文件

        -进程1 通过磁盘文件创建内存映射区

            -得到一个操作这块内存的指针

        -进程2 通过磁盘文件创建内存映射区

            -得到一个操作这块内存的指针

        使用内存映射区通信

注意:内存映射区通信,是非阻塞

#include<stdio.h>
#include <sys/mman.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<stdlib.h>
#include<wait.h>int main() {//打开一个文件int fd = open("test.txt", O_RDWR);//获取文件大小int size = lseek(fd, 0, SEEK_END);//创建内存映射区void * ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if(ptr == MAP_FAILED) {perror("map");exit(0);}//创建子进程pid_t pid = fork();if(pid > 0) {wait(NULL);//父进程char buf[64];strcpy(buf, (char *) ptr);printf("read data : %s\n", buf);} else if(pid == 0) {//子进程strcpy((char *) ptr, "nihao, son!!! \n");}//关闭内存映射区munmap(ptr, size);return 0;
}

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"内存的映射":http://eshow365.cn/6-12528-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!