• 内存的映射


    #include

           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 通过磁盘文件创建内存映射区

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

            使用内存映射区通信

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

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. int main() {
    10. //打开一个文件
    11. int fd = open("test.txt", O_RDWR);
    12. //获取文件大小
    13. int size = lseek(fd, 0, SEEK_END);
    14. //创建内存映射区
    15. void * ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    16. if(ptr == MAP_FAILED) {
    17. perror("map");
    18. exit(0);
    19. }
    20. //创建子进程
    21. pid_t pid = fork();
    22. if(pid > 0) {
    23. wait(NULL);
    24. //父进程
    25. char buf[64];
    26. strcpy(buf, (char *) ptr);
    27. printf("read data : %s\n", buf);
    28. } else if(pid == 0) {
    29. //子进程
    30. strcpy((char *) ptr, "nihao, son!!! \n");
    31. }
    32. //关闭内存映射区
    33. munmap(ptr, size);
    34. return 0;
    35. }

  • 相关阅读:
    PyTorch学习笔记(二)
    wordpress后台不能登录(多次重定向),前台样式里面https加载不上该怎么办呢?
    企业选择ai智能电话机器人的好处
    【算法】Java 算法设计模式的应用场景
    微服务系列之分布式日志 ELK
    Rust编程基础核心之所有权(下)
    社交创新的先锋:探秘Facebook背后的故事与智慧
    简单理解Vue中的数据代理
    通过 saltstack 批量更新 SSL 证书
    第五章TCP/IP 网络在我们身边
  • 原文地址:https://blog.csdn.net/ME_Liao_2022/article/details/133215195