2.17内存映射

#include <sys/mman.h>

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
    功能:将一个文件或者设备的数据映射到内存中
    参数:
        -addr:内存中映射的首地址,一般设置为NULL,表示由内核指定
        -length:要映射的数据的长度,这个值不能为0,建议使用文件的长度
                    获取文件的长度可以使用stat函数或者lseek函数
        -prot:对申请的内存映射区的操作权限
            - PROT_EXEC:可执行的权限
            - PROT_READ:读权限       要操作映射内存,必须要有读的权限
            - PROT_WRITE:写权限
            - PROT_NONE:没有权限
       -flags:
            - MAP-SHARED:映射区的数据会自动和磁盘文件进行同步,进程间通信,必须设置这个选项
            - MAP-PRIVATE:不同步,内存映射区的数据改变了,对原来的映射区不会修改,会重新创建一个映射区                
              个新的映射区。(copy on write)
        -fd:需要映射的那个文件的文件描述符,通过open得到,open的是一个磁盘文件
             注意:文件的大小不能为0,open指定的权限不能和prot参数有冲突
               prot:PROT_READ    open:只读/读写
               prot:PROT_READ | PROT_WRITE  open:读写
               prot的权限要小于等于open中的权限,并且prot必须有读的权限
        -offset:偏移量,一般不用。必须指定的是4K的整数倍。0表示不便宜
    返回值:返回创建的内存的首地址
        失败返回MAP_FAILED,(void*)-1

int munmap(void *addr, size_t length);
    功能:释放内存映射
    参数:
        -addr:要释放的内存的首地址
        -length:要释放的内存的大小,要和mmap的length值一样。
    返回值:
        成功返回0,失败返回-1
使用内存映射实现进程间通信:
    1.有关系的进程(父子进程)
        还没有子进程的时候,通过唯一的父进程,先创建内存映射区
        有了内存映射区以后,创建子进程
        父子进程共享创建的内存映射区

    2.没有关系的进程间通信
        准备一个大小不是0的磁盘文件
        进程1通过磁盘文件创建内存映射区,得到一个操作这块内存的指针
        进程2通过磁盘文件创建内存映射区,得到一个操作这块内存的指针
        使用内存映射区通信

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

猜你喜欢

转载自blog.csdn.net/m0_38062470/article/details/113843016