通过使用 mmap() 在进程之间共享内存

2023-12-20

我使用的是Linux 2.6。我有一个环境,其中两个进程通过消息传递模式的简单实现来模拟(使用共享内存)数据交换。

我有一个客户端进程(从父进程(即服务器)分叉),它将结构(消息)写入创建的内存映射区域(在分叉之后):

message *m = mmap(NULL, sizeof(message), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0)

然后,该指针被写入队列(以链表的形式)到服务器和客户端进程共用的另一个共享内存区域(因为 if 是在 fork 之前使用上面相同的代码创建的)。然后服务器读取该区域,获取消息的指针并对其进行处理。

问题是 *m 是在 fork() 之后创建的,当服务器进程尝试访问指向的内存位置时,我收到分段错误。在客户端创建该内存区域后,是否可以将其附加到服务器 POST 分叉?

注意:我不想在分叉之前将指针映射到消息(然后事先与服务器共享),因为我通常不知道客户端想要发送多少消息到服务器,而且可能还有更多消息超过 1 个客户端进程,因此我想仅在客户端需要发送消息时创建一个新的共享内存块,并在服务器收到该消息后取消映射它。

注意:这是出于学术目的:我知道这不是解决这个问题的最佳方法,但我只需要遵循这条路径。

提前致谢!


在客户端创建该内存区域后,是否可以将其附加到服务器 POST 分叉?

MAP_ANONYMOUS|MAP_SHARED映射内存只能由执行该操作的进程访问mmap()调用或其子进程。另一个进程无法映射相同的内存,因为该内存无法从其他地方引用,因为它是匿名的.

Using shm_open()调用它可以创建named共享内存,可以被不相关的进程引用和映射。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过使用 mmap() 在进程之间共享内存 的相关文章

随机推荐

  • 无法激活 NavigationPageRenderer 类型的实例

    我有一个 MasterDetailPage 该页面被推送到导航 await MainPage Navigation PushAsync new MasterDevicePage 当主设备页面加载时 主页面的列表视图将选择其中一个页面并将其显
  • ParameterizedType 并创建通用 dao

    我尝试这个通用代码是因为我不想为数据库中的每个实体创建一个 dao 类 因为我有 80 个专门为那些我将执行 CRUD 查询的实体创建的 dao 类 因为在大多数情况下我只需要坚持或通过 id 进行查找 public interface G
  • 如何在lines()中添加其他字符,例如箭头?

    这个问题解释了如何使用lines 制作不同的线型 如何在R中为图形定义更多线型 https stackoverflow com questions 25788945 how to define more line types for gra
  • 为什么 eclipse 会创建 .settings 目录?

    我注意到 eclipse 最近创建了一个 settings 目录 里面有 1 个文件 我想知道是否应该将其添加到版本控制中 SVN 另外 这是新的吗 我已经使用eclipse很长一段时间了 但从未注意到它 目录中文件的内容是这样的 Sun
  • 如何在 JavaScript 中向 MVC 模型添加项目?

    我想使用 java 脚本动态地将项目添加到模型中的列表中 如何使 MVC 将新项目绑定到模型 我的模型 public class Garage public string Name get set public string Locatio
  • VBA 变量何时实例化

    我很犹豫要不要问 但我找不到任何文档for VBA 相关 但我不认为是骗人的 C 全局变量什么时候创建 https stackoverflow com questions 19618801 when are global variables
  • 如何忽略 PostgreSQL 窗口函数中的空值?或返回列中的下一个非空值

    假设我有下表 User id COL1 COL2 1 1 1 2 1 2421 1 1 1 3542 2 1 我需要另一列指示每行的下一个非空 COL1 值 因此结果如下所示 User id COL1 COL2 COL3
  • 发生未处理的异常:项目目标不存在

    我写的时候遇到一个问题 ionic cordova prepare android 知道我创建的每个新项目都会发生这种情况 请帮忙 该问题是由缺少所需的构建器引起的angular json文件 要安装这些构建器 请运行 ng add ion
  • Django Tastypie:“通过”关系实现多对多

    我已经对这个问题进行了很多搜索 并在 Stack Overflow 上浏览了一堆相关问题 但似乎没有关于如何 通过 中间模型 或者可能是 实现多对多关系的明确答案我错过了它 我有一个名为 Sample 的模型 它与 Region 具有多对多
  • 如何将 cex 中的点大小转换为绘图单位?

    我试图计算出图中 x 和 y 方向上的点的半径有多大 它们的大小由cex 我想创建一个需要这些信息的绘图函数 在我看来好像cex这将是一个神奇的参数 但没有人真正知道它到底会做什么 我正在创建一个情节png功能 我设置了图表的宽度和高度 我
  • 在cygwin中运行并编译java代码

    我刚刚安装cygwin我想知道如何编译和运行我的java代码cygwin 我的 java 代码在我的桌面上保存在名为 Java 的文件中 假设您安装了适用于 Windows 的 Java SDK 在最简单的情况下 确保 将 java 添加到
  • Flutter:关于数据更改的 Firebase 推送通知

    收到评论后 我已将以下代码部署到我的 firebase 项目中 并且已成功部署 但没有向我发送任何通知 请在此处查看我的 Firebase 实时数据库屏幕截图 以便更好地理解 现已解决 它将仅向一个 ID 即我的管理设备 发送通知 工作代码
  • 将弱学习器组合成强分类器

    如何将少数弱学习器组合成一个强分类器 我知道公式 但问题是 在我读过的每一篇关于 AdaBoost 的论文中 只有公式 没有任何示例 我的意思是 我的学习器和权重都很弱 所以我可以按照公式告诉我的去做 将学习器乘以它的权重 然后加上另一个乘
  • 具有命令绑定的多个参数

    我有一个带有命令绑定并使用 Prism 库的文本块 这是 XAML 部分
  • 关于C# Expression.MakeBinary(),如何使用

    About Expression MakeBinary BinaryExpression MakeBinary ExpressionType binaryType Expression left Expression right bool
  • 如何在SQL SERVER中使用sqb文件恢复数据库

    我有一个带有 sqb 扩展名的文件 例如 clark sqb 我应该如何使用 sqb 文件恢复数据库 谢谢 SQB 文件是使用 RedGate 的 SQL 备份工具创建的 他们提供了一个名为的命令行工具sqb2mtf可用于转换为本机 SQL
  • Java 8 接口中静态方法的用途是什么?

    为什么 Java 8 支持静态方法 下面代码中 main 方法中的两行有什么区别 package sample public class A public static void doSomething System out println
  • 无法加载文件或程序集“Microsoft.Practices.Unity”

    我正在尝试升级Unity版本 2 1 505 2 但是当我运行该应用程序时 我得到以下信息FileLoadException 无法加载文件或程序集 Microsoft Practices Unity 版本 2 0 414 0 文化 中性 P
  • 如何批量限制事件?

    如何批量限制事件 比方说 我想在用户输入时触发文件保存 但执行文件系统访问的频率不超过每 100 毫秒一次 块事件处理程序示例 on
  • 通过使用 mmap() 在进程之间共享内存

    我使用的是Linux 2 6 我有一个环境 其中两个进程通过消息传递模式的简单实现来模拟 使用共享内存 数据交换 我有一个客户端进程 从父进程 即服务器 分叉 它将结构 消息 写入创建的内存映射区域 在分叉之后 message m mmap