我想编写一对程序,其中一个程序读取数据并将其传输到内部格式,另一个程序将内部格式转换为其他程序。作为一个练习,我想在不使用管道的情况下编写这些程序之间的交互。我更喜欢使用信号和共享内存。
我有程序A和B,其中A调用B.我怎么能
更具体地说,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
代替它是否更好?
答案 0 :(得分:5)
* nix系统有几个共享内存API:
mmap()
。要在不相关的进程之间共享内存,请将其与文件关联。您还可以使用MAP_ANONYMOUS
和fork()
来共享相关进程之间的内存(但请确保使用-1作为fd
以实现可移植性)。shmget()
创建/获取对共享内存区域的引用,通过shmat()
附加到它,分离通过shmdt()
,使用shmctl()
标记删除。您可以通过密钥识别共享内存区域,该密钥应该是唯一的。shm_open()
然后mmap()
。