Linux系统【五】进程间通信-共享内存mmap
mmap函数
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
参数:
void *addr
建立映射区的首地址,由Linux内核指定,所以我们直接传递NULL。也就是说虽然这是一个参宿但是并不需要我们传递,当建立好映射区以后映射区的首地址将以返回值返回。size_t length
建立映射区的大小,一般由创建映射区的文件的大小int prot
用来表示映射区的权限(读,写,读写,执行,对于执行一般是操作系统调用)。PROT_READ
PORT_WRITE
PROT_READ | PROT_WRITE
int flags
标志位参数,可以通过设置标志位来决定对映射区的修改是否反应到磁盘上。MAP_SHEARD
会将映射区所做的修改反映到物理设备上MAP_PRIVATE
映射区所做的修改不会反映到物理设备
int fd
用来建立映射区的文件描述符off_t offset
映射文件的偏移,用于截取文件的一部分建立映射区(4K的整数倍)
返回值:
成功返回创建映射区的首地址。失败返回MAP_FAILED
ftruncate
用来扩展文件大小
关闭映射区:
int munmap(void *addr, size_t length);
第一个参数必须是映射区的首地址,长度可以变化
成功返回0,失败返回-1
例如:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<string.h>int main()
{int fd = open("mmap1file",O_CREAT | O_RDWR | O_TRUNC ,0644);if(-1 == fd){perror("open error");exit(1);}if(-1 == ftruncate(fd, 128)) {perror("ftruncate error:");exit(1);}char *p = mmap(NULL, lseek(fd,0,SEEK_END), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if(MAP_FAILED == p){perror("mmap error:");exit(1);}strcpy(p,"Hello mmap!");close(fd); //关闭文件if(-1 == munmap(p,128)){perror("munmap error:");exit(1);}return 0;
}
注意事项
- 可以用
malloc
创建大小为0 的堆空间,并且可以free, 不可以创建大小为0 的映射区 - 如果文件是以只读方式打开的就不能改变文件大小
- 如果文件是以只读方式打开,那么不能将映射区设置为
MAP_SHARED
,但是可以将映射区设置为MAP_PRIVATE
- 如果文件以只写方式打开,将无法建立映射区,错误信息为
Permission denied
,因为创建映射区的过程中其实有一次隐含的读操作 - 创建映射区的权限要小于等与文件的权限
- 偏移量必须是页(4K)的整数倍
- 因为
mmap
容易出错,所以一定要保留mmap的返回值,并通过perror
输出错误信息 - 关闭映射区的时候
munmap
的第一个参数必须是映射区的首地址 - 建立映射区以后文件即使关闭也不影响,如果是
MAP_SHARED
的话仍旧会修改磁盘文件
利用共享内存在父子进程之间通信
用于通信的时候我们创建一个临时文件,成功创建映射区以后将文件关闭不再使用。
具体的方法是:
- 创建一个文件
- 使用
ftruncate
函数改变文件大小 - 使用
unlink
函数删除目录项(创建临时文件) - 建立映射区
- 关闭文件
在父子进程间通信时MAP_SHARED
指的是共享同一个映射区,MAP_PRIVATE
指的是不共享映射区,父子进程分别占用
匿名映射
因为正常mmap
函数必须依赖一个文件,虽然这个文件没有存在的必要,因此我们需要open
、ftruncate
、unlink
、close
比较麻烦。因此我们可以使用匿名映射较为方便地创建映射区。
int *p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
len
可以根据我们的需要修改大小。
MAP_ANONYMOUS
表示匿名通信,可以简写为MAP_ANON
需要注意的是MAP_ANONYMOUS
只能够在Linux
系统中使用,在其他类Unix
系统中不可以使用,在其他系统中使用字符设备文件/dev/zero
int fd = open("/dev/zero", O_RDWR);
p = (int*)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
mmap无血缘关系进程通信
同一个文件创建的是一个映射区,因此如果我们想要在没有血缘关系,就需要通过同一个文件来建立映射区
strace 可执行文件
追踪程序里面所使用的系统调用有哪些
其实Linux系统对文件的操作是通过mmap进行的
Linux系统【五】进程间通信-共享内存mmap相关推荐
- Linux系统编程—进程间通信—共享内存
Linux共享内存 共享内存就是允许两个或多个进程共享一定的存储区.就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一个进程改变了这块地址中的内容的时候,其它进程都会察觉 ...
- Linux基础入门--进程间通信--共享内存
Linux基础入门--进程间通信--共享内存 1.共享内存IPC原理 2.共享内存管理 1.共享内存IPC原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,共享内存是在内存单独开辟的一段内 ...
- c++ fork 进程时 共享内存_linux共享内存mmap
Linux进程间通信-共享内存mmap 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的 ...
- Linux环境进程间通信(五): 共享内存(上)
Linux环境进程间通信(五): 共享内存(上) 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间. ...
- 好文转载 Linux环境进程间通信(五): 共享内存(上)
http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写 ...
- Linux进程间通信:共享内存mmap、xsi和posix
前言 本文主要说明在Linux环境上如何使用共享内存.阅读本文可以帮你解决以下问题: 什么是共享内存和为什么要有共享内存? 如何使用mmap进行共享内存? 如何使用XSI共享内存? 如何使用POSIX ...
- Linux下进程间通信--共享内存:最快的进程间通信方式
内存共享最新整理: Linux下进程间通信-共享内存 - 码到城攻共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式https://www.codecomeon.com/posts/109/ ...
- 【Linux】Linux进程间通信——共享内存/消息队列/守护进程
文章目录 进程间通信--共享内存/守护进程 一, 共享内存 1. 共享内存概念 2. 共享内存使用 1. 共享内存使用步骤 2. 共享内存操作函数 3. 共享内存常用操作命令 4. 共享内存使用示例: ...
- linux篇【9】:进程间通信(共享内存)——<后序>
目录 一.system V共享内存--先让不同的进程看到同一份资源 1.共享内存原理 监控共享内存脚本 2.创建/获取 共享内存接口-shmget函数(shared memory get) 3.参数k ...
最新文章
- 如何同时安装Office2003和Office2007!
- HTML 30分钟入门教程
- spring boot示例_Spring Boot完成示例
- java java 检查型异常_如何整合Java中的有效性检查和异常抛出?
- 快手上市首日涨近161% 两大创始人身家破千亿
- 第二部分:开发简要指南-第六章 使用Fragments构建动态UI
- eNSP中AC用Web方式登录
- 吴恩达机器学习【第六天】神经网络模型
- Docker下ETCD集群搭建
- 一文搞懂前端对象的深拷贝与浅拷贝
- 英雄联盟一直连接服务器win10,win10上玩英雄联盟无法连接服务器是怎么回事
- 如何使用PS修改图片中的数字
- 用英语说计算机的优点1000,我的英语老师作文1000字
- 我的世界java村民繁殖_教程/村民养殖 - Minecraft Wiki,最详细的官方我的世界百科...
- C 合成的图片文件的小练习
- Java JNA (三)—— 结构体使用及简单示例
- Infrared的危害-激光和红外区别
- 软件开发Share the Cakes
- lammps案例:团簇融化过程模拟案例学习
- 音乐相册源码php,基于PHP的DIY音乐相册网站的设计与实现(MySQL)(含录像)
热门文章
- Jenkins 入门系列--jenkins 介绍
- EMF的一些总结(2)——关于EMF的序列化
- 计算机c语言二级题型,计算机二级C语言题型和评分标准
- 导出mysql excel数据字典_mysql导出 Excel数据字典(全)
- 网络html代码是什么问题,html代码问题
- batchplot插件用法_Batchplot批量打印怎么用?Batchplot批量打印教程
- java 线程“生产/消费”模型1
- 力扣删除排序数组中的重复项
- 开启linux ssh
- 嵌入式指针embedded pointer的概念以及用法