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

我有一个巨大的文件,即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()映射任何其他类型的对象(例如常规文件)时,也是如此.它始终是映射的对象,通过它可以协调任何共享访问.之所以必须这样,是因为内存映射是一个进程的属性-它本身不是可共享的.

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

上一篇:一次“内存泄露”引发的血案


下一篇:在C中堆栈不断增加的协同程序