4

动机

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

我想要的是

我有 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)状态手册页:

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

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

4

1 回答 1

5

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

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