首页 / LINUX / c – 在Linux下共享内存映射
c – 在Linux下共享内存映射
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c – 在Linux下共享内存映射,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1257字,纯文字阅读大概需要2分钟。
内容图文
![c – 在Linux下共享内存映射](/upload/InfoBanner/zyjiaocheng/954/0c029c0331ce4a9ca3e2b013925b25b4.jpg)
动机
我想编写一对程序,其中一个程序读取数据并将其传输到内部格式,另一个程序将内部格式转换为其他程序.作为一个练习,我想在不使用管道的情况下编写这些程序之间的交互.我更喜欢使用信号和共享内存.
我想要的是
我有程序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 – 在Linux下共享内存映射全部内容,希望文章能够帮你解决c – 在Linux下共享内存映射所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。