当前位置: 首页 > 面试题库 >

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

孟均
2023-03-14
问题内容

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

我有一个客户端进程(从父进程(即服务器)派生),该进程将struct(消息)写入使用以下命令创建的内存映射区域(在派生之后):

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

然后将此指针以链接列表的形式写入到另一个共享内存区域中的队列中,该共享内存区域对于服务器和客户端进程是通用的(因为如果在派生之前使用上面的相同代码创建了该指针)。然后由服务器读取该区域,该服务器获取指向消息的指针并进行处理。

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

注意:我不想在派生之前映射消息的指针(然后在与服务器共享之前),因为我通常不知道客户端要发送到服务器的消息数量,而且可能还有更多多于一个客户端进程,因此我只想在客户端需要发送消息时创建一个新的共享内存块,并在服务器收到该消息后取消映射。

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

提前致谢!


问题答案:

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

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

使用shm_open()调用可以创建 命名的 共享内存,不相关的进程可以引用和映射该共享内存。



 类似资料:
  • 问题内容: 我正在尝试使用部分函数,​​以便pool.map()可以定位具有多个参数(在本例中为Lock()对象)的函数。 这是示例代码(摘自我之前的问题的答案): 但是,当我运行此代码时,出现错误: 我在这里想念什么?如何在子流程之间共享锁? 问题答案: 您不能将普通对象传递给方法,因为它们不能被腌制。有两种方法可以解决此问题。一种是创建并传递一个: 不过,这有点重量级;使用需要产生另一个进程来

  • 问题内容: 我想知道这个著名报价的最真实的解释是什么: 不要通过共享内存进行交流;通过通信共享内存。(R.派克) 在Go Memory Model中,我可以阅读以下内容: 通道上的发送发生在该通道上的相应接收完成之前。(Golang规格) 还有一篇专门的golang文章解释了报价。而关键的贡献是一个工作例子也由Andrew G. 好。有时谈论太多....我是从“内存规范”引用中得出的,也可以通过查

  • 我想在多个python进程之间共享。以便从其他python进程发送。 如何跨多个python进程共享。 代码如下: 目标是从通道从其他python进程发送。

  • 问题内容: 在此线程中,建议在Linux中使用OP 而不是获取共享内存。我访问了这个页面,这个页面来获得一些文件,但第二个方面给出了一个模糊的例子。 几乎是新手,并且需要在两个进程之间共享一些信息(以文本形式),我应该使用该方法还是?又为什么呢 问题答案: 两种方法都是可行的。该方法比限制性更强,但更易于使用。是旧的System V共享内存模型,并且支持范围最广。/ 是用于共享内存的新POSIX方

  • 在这个线程中,建议OP使用而不是来获取Linux中的共享内存。我访问了这个页面和这个页面以获得一些文档,但是第二个页面给出了一个关于的模糊示例。 作为一个新手,并且需要在两个进程之间共享一些信息(文本形式),我应该使用方法还是?为什么呢?

  • 问题内容: 我有以下问题。我编写了一个函数,该函数将列表作为输入并为列表中的每个元素创建一个字典。然后,我想将此字典追加到新列表中,以便获得字典列表。我正在尝试为此生成多个进程。我在这里的问题是,我希望不同的进程访问字典列表,因为它由其他进程更新,例如,一旦达到一定长度,就打印一些东西。 我的例子是这样的: 现在我的问题是每个过程都创建自己的过程。有没有一种方法可以在进程之间共享列表,以便所有字典