ICode9

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

c-如何在内存中像shmget一样重新映射文​​件mmap(2)-ed

2019-11-08 07:50:28  阅读:248  来源: 互联网

标签:shared-memory mmap low-level c-3 linux


我有一个巨大的文件,即1TiB作为’filehandler’拥有,允许rwx ——.我mmap(2)-将其放入64位地址空间,所有工作均成功完成.该文件由以“ filehandler”用户身份运行的进程处理.

其他进程向该处理程序进程请求服务,而该处理程序进程以文件处理程序以外的其他用户身份运行.他们通过unix套接字登录到处理程序.他们按照IPC规则进行交流,一切正常.

出于安全原因,不得将整个文件共享给请求者.在文件中,仅允许某些部分访问请求者进程.

如果共享内存,而只是请求进程允许的文件部分,则将获得最佳性能.

例如,shm提供了用于访问其他进程段的密钥,这是针对请求者的实际目标.

有什么方法可以仅将mmap(2)-ed空间的允许部分共享给像shm技术这样的任何进程吗?

解决方法:

Is there any way to share only the allowed parts of a mmap(2)-ed space to any processes identified like shm technology?

TL; DR:否.

更详细地说,

How to remap a file mmap(2)-ed in memory like shmget

mmap()和shmget()并不是真正可比的.更好的比较是一方面是shm_open()/ ftruncate()/ mmap()的组合,另一方面是shmget()/ shmat()的组合.这些是POSIX中创建带标签的共享内存段并将其映射到进程地址空间的主要替代方法.您应该在那里认识到shmget()的类似物是shm_open(),而mmap()的类似物在这里是shmat().

现在,返回

Is there any way to share only the allowed parts of a mmap(2)-ed space to any processes identified like shm technology?

请注意,在以上两种情况下,都是要映射的对象(共享内存段)提供了不相关进程之间的共享,而与mmap()本身无关.当mmap()映射任何其他类型的对象(例如常规文件)时,也是如此.它始终是映射的对象,通过它可以协调任何共享访问.之所以必须这样,是因为内存映射是一个进程的属性-它本身不是可共享的.

您的设计要求文件处理程序进程充当数据的网守,而不是允许客户端直接访问它.很好,但是可以防止客户端将文件映射到内存中.您可能会安排客户端通过任一类型的共享内存段访问数据,但这将要求服务器将正确的数据从大文件中复制到客户端的共享内存段中.可能确实需要考虑这一点,但是您可以忘记为客户端提供直接内存映射文件访问的服务器.

标签:shared-memory,mmap,low-level,c-3,linux
来源: https://codeday.me/bug/20191108/2006556.html

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

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

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

ICode9版权所有