在Linux下共享内存映射

时间:2012-09-15 17:02:33

标签: c linux memory-mapping execve

动机

我想编写一对程序,其中一个程序读取数据并将其传输到内部格式,另一个程序将内部格式转换为其他程序。作为一个练习,我想在不使用管道的情况下编写这些程序之间的交互。我更喜欢使用信号和共享内存。

我想要什么

我有程序A和B,其中A调用B.我怎么能

  1. 从程序A
  2. 创建一个内存块
  3. 从程序A调用程序B,为其提供有关在何处查找内存块的信息
  4. 使用两个程序中的内存块。
  5. 更具体地说,A解码自定义视频格式并将单个未压缩帧放入共享缓冲区。 B从缓冲区读取并将其编码为输出strean。解码器每秒最多解码100帧,大约500 MiB / s内存流量。管道结果很慢,因为数据必须经常复制,缓冲区不是很大。

    我认为可行的方法

    我的想法是使用mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0)创建一部分共享内存。问题是,execve(2)的联机帮助页指出:

      

    不保留内存映射(mmap(2))。

    那么,我如何与其他程序共享该内存?将两个功能放入一个程序并使用fork代替它是否更好?

1 个答案:

答案 0 :(得分:5)

* nix系统有几个共享内存API:

  • BSD:使用mmap()。要在不相关的进程之间共享内存,请将其与文件关联。您还可以使用MAP_ANONYMOUSfork()来共享相关进程之间的内存(但请确保使用-1作为fd以实现可移植性)。
  • 系统V :(有些人真的不喜欢这个)使用shmget()创建/获取对共享内存区域的引用,通过shmat()附加到它,分离通过shmdt(),使用shmctl()标记删除。您可以通过密钥识别共享内存区域,该密钥应该是唯一的。
  • POSIX:从返回的文件描述符中使用shm_open()然后mmap()