zoukankan      html  css  js  c++  java
  • linux多进/线程编程(5)——进程间通信之mmap

    参考资料:

    1.博客1:https://www.jianshu.com/p/755338d11865

    mmap:一种内存映射文件的方法 memory map

    父子进程和无亲缘关系的进程,都可以将自身用户空间映射到同一个文件或匿名映射到同一片区域,实现进程间通信。

    函数原型:

    #include <sys/mman.h>
    
    创建映射:
    void *mmap(void *addr, size_t length, int prot, int flags,
    int fd, off_t offset);
    
    释放映射的地址:
    int munmap(void *addr, size_t length);

    相关描述:

    mmap() creates a new mapping in the virtual address space of the calling process.  mmap在调用进程的虚拟地址空间中创建一个新的映射。
    
    The starting address for the new mapping is specified in addr.  这个新映射的起始地址在addr(参数1)中指定。
    
    The length argument specifies the length of the mapping. length参数指定映射的长度。

    映射关系可以分为两种

    1、文件映射
    磁盘文件映射进程的虚拟地址空间,使用文件内容初始化物理内存。
    2匿名映射
    初始化全为0的内存空间。关键字:MAP_ANON

    一般我都会使用匿名映射,因为文件映射需要首先创建一个文件,仅起到媒介作用,参考下图:

    而对于映射关系是否共享又分为

    1、私有映射(MAP_PRIVATE)
    多进程间数据共享,修改不反应到磁盘实际文件,是一个copy-on-write(写时复制)的映射方式。
    2、共享映射(MAP_SHARED)
    多进程间数据共享,修改反应到磁盘实际文件中。

    匿名映射参考代码:

    #include <iostream>
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/mman.h>
    #include <sys/wait.h>
    
    int main() {
    
      //匿名映射
      int *memory = (int*) mmap(nullptr, 4, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
    
      if (memory == MAP_FAILED) {
        perror("mmap err!");
        return -1;
      }
    
      pid_t pid = fork();
      if (pid == 0) {
        //son
        *memory = 123;
        printf("son memory = %d
    ", *memory);
        sleep(3);
        printf("son memory = %d
    ", *memory);
      } else if (pid > 0) {
        //parent
        sleep(1);
        *memory = 45678;
        printf("parent memory = %d
    ", *memory);
        wait(nullptr);//阻塞回收子进程,因为父进程先退出,所以要回收子进程,否则孤儿进程
      }
    
      munmap(memory, 4);
    
      return 0;
    }
  • 相关阅读:
    不同编码字符所占大小
    期末考点总结--------多元统计分析
    博客网站设计
    java 事件举例
    zookerper总结
    Spring java配置
    Sense and Sensibility
    栈的出栈序列个数
    闭算子
    线性空间结论总结
  • 原文地址:https://www.cnblogs.com/kongweisi/p/14693460.html
Copyright © 2011-2022 走看看