Linux 共享内存mmap,进程通信

news2024/11/24 22:33:47

文章目录

  • 前言
  • 一、存储映射 I/O
  • 二、mmap, munmap
  • 三、父子进程间 mmap 通信
  • 四、非血缘关系进程间 mmap 提通信
  • 五、mmap 匿名映射区
  • 总结

前言

进程间通信是操作系统中重要的概念之一,使得不同的进程可以相互交换数据和进行协作。其中,共享内存是一种高效的进程间通信机制,而内存映射(mmap)是实现共享内存的一种常见方法。


一、存储映射 I/O

存储映射 I/O 是 一个磁盘文件 与 存储空间中的一个缓冲区相映射。于是, 当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入文件。这样, 就可在 不适用 read 和 write 函数的情况下,使用 地址(指针)完成 i/o 操作。

使用这种方法,首先应通知内核,将一个指定文件映射到存储区域中。这个映射工作可以通过 mmap 函数来实现。使用 mmap 系统调用,进程可以直接操作共享内存的指针,而不需要复杂的数据结构和同步机制。
在这里插入图片描述

理解 共享内存
共享内存是一种特殊的内存区域,它可以被多个进程访问和操作。这意味着不同的进程可以直接读取或写入该共享内存区域中的数据。相比于其他进程间通信机制,共享内存具有较低的开销和高效的数据传输速度。


二、mmap, munmap

mmap 用于创建共享内存映射。munmap 用来 释放内存。

 #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);
  1. void * mmap ( void * addr, size_t length , int prot , int flags , int fd , off_t offset ) ;

参数:

  • addr : 指定映射区的首地址。通常传 NULL / 0,表示让系统自动分配。
  • length :共享映射区的大小。
  • prot : 共享映射区的读写属性。
  • flags : 标注共享内存的共享属性。
  • fd :用于创建共享映射区的哪个文件的,文件描述符。
  • offset :

返回值:
在这里插入图片描述

  • 成功 : 映射区的首地址。
  • 失败 : 返回 M AP_FAILED。
  1. int munmap ( void * addr , size_t length ) ;
    在这里插入图片描述

三、父子进程间 mmap 通信

void sys_error(const char *str)
{
	perror(str);		
	exit(1);									// 正常退出程序
}

int var = 10;

int main(void)
{
	int fd;
	char *p;
	pid_t pid;

	fd = open("1.txt", O_RDWR);
	if(fd < 0)
	{
		sys_error("open error");
	}

	ftruncate(fd,100);								// 扩展空间大小
	int len = lseek(fd,0,SEEK_END);
	
	p = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED,fd, 0);		// 创建共享映射区
	if(p == MAP_FAILED)
	{
		sys_error("map error!");
	}
	close(fd);

	pid = fork();								 // 创建子进程
	if(pid == 0)
	{
		strcpy(p,"This is child");
		var = 100;
		printf("%s, Child: var = %d\n",p, var);
	}
	else
	{
		sleep(1);
		printf("Parent: %s,var = %d\n",p,var);
	}

	wait(NULL);											// 回收子进程
	munmap(p, len);										// 释放映射区

	return 0;
}

在这里插入图片描述
var 是 全局变量,父子进程操作 全局变量时,读数据时 共享; 写数据时 复制。
上述代码中,子进程写数据时,是复制一份数据 后 对复制的数据进程修改。父进程 读数据时,全局变量还是原本的数值。

四、非血缘关系进程间 mmap 提通信

1.c 不断写数据:

void sys_error(const char *str)
{
	perror(str);		
	exit(1);
}

int main(void)
{
	int fd;
	char *p;
	int i = 0;

	fd = open("1.txt", O_RDWR);
	if(fd < 0)
	{
		sys_error("open error");
	}

	ftruncate(fd,100);
	int len = lseek(fd,0,SEEK_END);
	
	p = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED,fd, 0);
	if(p == MAP_FAILED)
	{
		sys_error("map error!");
	}
	close(fd);
	
	while(1)
	{
		sleep(1);
		*p = i;								// 不断写入数据
		i++;
	}
	
	munmap(p, len);
	return 0;
}

2.c 不断读数据

void sys_error(const char *str)
{
	perror(str);		
	exit(1);
}

int main(void)
{
	int fd;
	char *p;
	int i = 0;

	fd = open("1.txt", O_RDWR);
	if(fd < 0)
	{
		sys_error("open error");
	}

	ftruncate(fd,100);
	int len = lseek(fd,0,SEEK_END);
	
	p = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED,fd, 0);
	if(p == MAP_FAILED)
	{
		sys_error("map error!");
	}
	close(fd);
	
	while(1)
	{
		sleep(1);
		printf("*p = %d\n",*p);				// 不断读数据
	}
	
	munmap(p, len);
	return 0;
}

在这里插入图片描述

五、mmap 匿名映射区

mmap 匿名映射区是在进程的虚拟内存空间中创建的一段没有对应物理文件的内存区域。它通常用于进程间通信和临时存储数据,不需要使用文件作为映射源。匿名映射区在 Linux 系统中非常常见。

在使用mmap系统调用创建匿名映射区时,传递给mmap函数的文件描述符参数(通常为-1)表明不会有一个与之相关联的文件。
mmap 函数的 参数二,可以为指定的大小。参数四 为 MAP_SHARED|MAP_ANONYMOUS

void sys_error(const char *str)
{
	perror(str);		
	exit(1);									// 正常退出程序
}

int var = 10;

int main(void)
{
	char *p;
	pid_t pid;

	p = mmap(NULL, 20, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);		// 创建共享映射区
	if(p == MAP_FAILED)
	{
		sys_error("map error!");
	}

	pid = fork();								 // 创建子进程
	if(pid == 0)
	{
		strcpy(p,"This is child");
		var = 100;
		printf("%s, Child: var = %d\n",p, var);
	}
	else
	{
		sleep(1);
		printf("Parent: %s,var = %d\n",p,var);
	}

	wait(NULL);											// 回收子进程
	munmap(p, 20);										// 释放映射区
	return 0;
}

总结

进程间共享内存映射(mmap)通信是一种高效、灵活的进程间通信机制。通过内存映射,不同的进程可以共享相同的数据区域,提高数据访问速度和性能。然而,在使用该机制时需要注意同步机制、内存管理和安全性等问题,以确保共享数据的正确性和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/865720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pycharm解决启动时候索引慢的问题

设置里去掉update里面的两个勾 shared indexes中&#xff0c;把自动下载索引改成不下载使用本地索引

JVM G1垃圾回收机制介绍

G1(Garbage First)收集器 (标记-整理算法)&#xff1a; Java堆并行收集器&#xff0c;G1收集器是JDK1.7提供的一个新收集器&#xff0c;G1收集器基于“标记-整理”算法实现&#xff0c;也就是说不会产生内存碎片。此外&#xff0c;G1收集器不同于之前的收集器的一个重要特点是&…

【OpenAI】当人工智能遇到道德困境问题(铁轨选择问题),它会怎么回复?

一条铁轨上&#xff0c;五个小孩在玩耍&#xff0c;而一辆火车即将撞上他们&#xff0c;这时你就在铁轨转轴拉杆的旁边&#xff0c;你可以选择拉下拉杆&#xff0c;让火车开向另一条铁轨&#xff0c;但是&#xff0c;另一条铁轨上&#xff0c;有一个铁轨工人正在休息。你会怎么…

赴日IT培训 想拿高度人才签证 加10分的IT资格哪个简单?

其实日本和我们国家一样&#xff0c;IT方面的资格证也是有很多的&#xff0c;你或许会担心万一我考的证没用可怎么办&#xff1f;我们应该知道&#xff0c;我们作为一个外国人&#xff0c;在掌握一些日本语言的情况下&#xff0c;考证本身对咱们来说就是一个学习的过程&#xf…

DIP:《Deep Image Prior》经典文献阅读总结与实现

文章目录 Deep Image Prior1. 方法原理1.1 研究动机1.2 方法 2. 实验验证2.1 去噪2.2 超分辨率2.3 图像修复2.4 消融实验 3. 总结 Deep Image Prior 1. 方法原理 1.1 研究动机 动机 深度神经网络在图像复原和生成领域有非常好的表现一般归功于神经网络学习到了图像的先验信息…

细数4K超清大运中的国产摄像机前端替代

8月8日&#xff0c;万众瞩目的成都大运会正式闭幕&#xff0c;此次赛事是继2001年北京大运会、2011年深圳大运会之后&#xff0c;中国大陆第三次举办大运会。中国队以103金40银35铜的成绩收官&#xff0c;金牌榜、奖牌榜双双第一。本届大运会执行“全4K”制作标准&#xff0c;是…

HCIP MPLS解决BGP黑洞路由和VPN技术

一、使用MPLS解决BGP的路由黑洞 前提条件&#xff1a;IBGP内部全网可达&#xff0c;并配置了MPLS。 MPLS协议并不会为通过BGP协议学习的路由条目分配标签号&#xff1b; 而是在访问这些BGP路由目标网段时&#xff0c;在流量中压入到达这些网段的BGP下一跳设备地址的标签号&a…

Go http.Handle和http.HandleFunc的路由问题

Golang的net/http包提供了原生的http服务&#xff0c;其中http.Handle和http.HandleFunc是两个重要的路由函数。 1. 函数介绍 http.HandleFunc和http.Handle的函数原型如下&#xff0c;其中DefaultServeMux是http包提供的一个默认的路由选择器。 func HandleFunc(pattern st…

大模型时代的程序员:不会用AIGC编程,未来5年将被淘汰?

作者 | 郭炜 策划 | 凌敏 前言 下面是一段利用 Co-Pilot 辅助开发的小视频&#xff0c;这是 Apache SeaTunnel 开发者日常开发流程中的一小部分。如果你还没有用过 Co-Pilot、ChatGPT 或者私有化大模型帮助你辅助开发的话&#xff0c;未来的 5 年&#xff0c;你可能很快就要…

企业直播MR虚拟直播(MR混合现实直播技术)视频介绍

到底什么是企业直播MR虚拟直播&#xff08;MR混合现实直播技术&#xff09;&#xff1f; 企业直播MR虚拟直播新玩法&#xff08;MR混合现实直播技术&#xff09; 我的文章推荐&#xff1a; [视频图文] 线上研讨会是什么&#xff0c;企业对内对外培训可以用线上研讨会吗&#x…

软件测试面试时一些不能说的离职原因

“你为什么从上一家公司离职&#xff1f;”这个问题在面试时基本都会被问到&#xff0c;这是无法避免的问题。那么什么样的理由才能做到既反映实际情况&#xff0c;又能得到HR认可呢&#xff1f;以下的几种回答千万不能脱口而出。 1、毫无顾忌地说前公司的坏话 1&#xff09;…

nodejs+vue+elementui招聘求职网站系统的设计与实现-173lo

&#xff08;1&#xff09;管理员的功能是最高的&#xff0c;可以对系统所在功能进行查看&#xff0c;修改和删除&#xff0c;包括企业和用户功能。管理员用例如下&#xff1a; 图3-1管理员用例图 &#xff08;2&#xff09;企业关键功能包含个人中心、岗位类型管理、招聘信息…

TOMCAT的多实例部署和动静分离

tomcat的多实例 动静分离 排错小工具&#xff1a; telnet工具&#xff1a;yum -y install telnet telnet工具用于测试端口是否正常 telnet 20.0.0.101 80Tomcat多实例部署&#xff1a; 一台服务器上有多个tomcat的服务 1.安装好 jdk 2.安装 tomcat cd /opt tar zxvf apache-…

逆向破解学习-登山赛车

试玩 课程中的内容 Hook代码 import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage;public class HookComYoDo1SkiSafari2TXYYB_01 extends HookImpl{Overridepublic String p…

全排列 II——力扣47

文章目录 题目描述解法题目描述 解法 class Solution {public:vector<int> vis;void dfs(vector<int&

vscode + docker + python

1&#xff0c;docker run的时候要加上port docker run -it --gpusall -p 2222:22 -v /挂载目录/:/docker 目录1/ -v /挂载目录/:/docker 目录2/ --namexxx image:v2 /bin/bash 2&#xff0c;docker 内部要安装ssh 2.1方法命令&#xff1a; apt-get update apt-get install…

飞凌嵌入式i.MX9352嵌入式ARM开发板,让通信安全又稳定——EMC防护,静电、浪涌、脉冲4级防护能力

随着新基建的加快推进&#xff0c;智能制造迎来了更好的发展时机&#xff0c;嵌入式板卡等智能设备也在更多的应用场景中大放异彩。但随着现场的设备数量的剧增&#xff0c;环境中的各种干扰信号也随之增加&#xff0c;这就对设备间通信的安全性与稳定性提出了更高的要求。 1【…

SAP AIF-Application Interface Framework基本介绍

AIF-Application Interface Framework基本介绍 SAP AIF-应用程序接口框架特性&#xff1a; 通知业务用户出错的自动警报&#xff1b; 用户友好的事务&#xff0c;用于界面监控、错误处理和直接从应用系统内纠正错误&#xff1b; SAP GUI 和基于 Web 的用户界面&#xff1b; 使…

mybatis debug断点查看实际运行语句

1、如果是idea&#xff0c;ctrln搜索 PreparedStatementHandler&#xff0c;找到如下类&#xff1a; 2、根据当前语句是查询、更新等去对应方法中打断点如上图 3、 如下图中即可看到

nginx 以及nginx优化

目录 nginx功能介绍 静态文件服务 反向代理 动态内容处理 SSL/TLS 加密支持 虚拟主机支持 URL 重写和重定向 缓存机制 日志记录 可扩展性和灵活性 nginx的主要应用场景 nginx常用命令 nginx另外一种安装方式 nginx常用的信号符&#xff1a; nginx配置文件详解 n…