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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)