动机
我想编写一对程序,其中一个程序读取数据并将其转换为内部格式,另一个程序将内部格式转换为其他格式。作为练习,我想在不使用管道的情况下对这些程序之间的交互进行编码。我更喜欢使用信号和共享内存。
我想要什么
我有程序 A 和 B,其中 A 调用 B。我怎么能
- 从程序A创建一个内存块
- 从程序A调用程序B,给它关于在哪里找到内存块的信息
- 使用两个程序的内存块。
更具体地说,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/