fuz*_*fuz 3 c linux memory-mapping execve
我想编写一对程序,其中一个程序读取数据并将其传输到内部格式,另一个程序将内部格式转换为其他程序.作为一个练习,我想在不使用管道的情况下编写这些程序之间的交互.我更喜欢使用信号和共享内存.
我有程序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吗?
*nix系统有几个用于共享内存的API:
mmap().要在不相关的进程之间共享内存,请将其与文件关联.您还可以使用MAP_ANONYMOUS和在相关进程之间共享内存fork()(但请确保使用-1作为fd可移植性).shmget()创建/获取对共享内存区域的引用,通过附加,通过shmat()分离shmdt(),标记为删除shmctl().您可以通过密钥识别共享内存区域,该密钥应该是唯一的.shm_open()然后mmap()从返回的文件描述符中使用.