c - Linux下共享内存映射

标签 c linux memory-mapping execve

动机

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

我想要什么

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

  1. 从程序A创建一个内存块
  2. 从程序A调用程序B,给它关于在哪里找到内存块的信息
  3. 使用两个程序的内存块。

更具体地说,A 解码自定义视频格式并将单个未压缩帧放入共享缓冲区。 B 从缓冲区中读取并将其编码为输出流。解码器每秒最多解码 100 帧,这大约是 500 MiB/s 内存流量。事实证明,管道很慢,因为必须过于频繁地复制数据并且缓冲区不是很大。

我认为可行的方法

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

Memory mappings are not preserved (mmap(2)).

那么,我怎样才能与其他程序共享该内存呢?将这两种功能放在一个程序中并改用 fork 是更好的主意吗?

最佳答案

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

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

关于c - Linux下共享内存映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12439374/

相关文章:

c - 使用相同的套接字发送和接收 UDP 多播数据包

c - 上下文切换场景下clock_gettime()的准确性

c - Linux内核的list.h

node.js - 使用 NVM( Node 版本管理器)bash : line 5: npm: command not found 安装时,Laravel Envoy 在 Ubuntu 上无法检测 Node/npm

linux - 为什么 proc/ID/maps 有多个共享库条目

c - 尝试将结构传递给函数时出错

c - pthreads 程序表现不佳

php - 在 Centos 上守护 php 脚本

c++ - 模拟游戏机的内存映射,根据提供的地址访问不同的位置

java - 如何在 Java 中内存映射(mmap)一个 linux block 设备(例如/dev/sdb)?