ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

c – 在Linux下共享内存映射

2019-09-01 19:51:01  阅读:235  来源: 互联网

标签:c-3 execve linux memory-mapping


动机

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

我想要的是

我有程序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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有