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\n", *memory); sleep(3); printf("son memory = %d\n", *memory); } else if (pid > 0) { //parent sleep(1); *memory = 45678; printf("parent memory = %d\n", *memory); wait(nullptr);//阻塞回收子进程,因为父进程先退出,所以要回收子进程,否则孤儿进程 } munmap(memory, 4); return 0; }