系统相关
首页 > 系统相关> > c – 在Linux下共享内存映射

c – 在Linux下共享内存映射

作者:互联网

动机

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

我想要的是

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

>从程序A创建一个内存块
>从程序A调用程序B,为其提供有关在哪里找到内存块的信息
>使用两个程序中的内存块.

更具体地说,A解码自定义视频格式并将单个未压缩帧放入共享缓冲区. B从缓冲区读取并将其编码为输出strean.解码器每秒最多解码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()来共享相关进程之间的内存(但请确保使用-1作为fd以实现可移植性).
>系统V :(有些人真的不喜欢这个)使用shmget()创建/获取对共享内存区域的引用,通过shmat()附加到它,通过shmdt()分离,用shmctl()标记删除.您可以通过密钥识别共享内存区域,该密钥应该是唯一的.
> POSIX:从返回的文件描述符中使用shm_open()然后使用mmap().

标签:c-3,execve,linux,memory-mapping
来源: https://codeday.me/bug/20190901/1785746.html