Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在内存中重新映射文件mmap(2)-ed,如shmget_C_Linux_Shared Memory_Mmap_Low Level - Fatal编程技术网

C 如何在内存中重新映射文件mmap(2)-ed,如shmget

C 如何在内存中重新映射文件mmap(2)-ed,如shmget,c,linux,shared-memory,mmap,low-level,C,Linux,Shared Memory,Mmap,Low Level,我有一个巨大的文件ie 1TiB作为“filehandler”拥有,允许使用rwx------。我将它映射到64位地址空间,并且所有操作都成功。此文件由以用户“filehandler”身份运行的进程处理 其他进程从以filehandler以外的其他用户身份运行的此处理程序进程请求服务。他们通过unix套接字登录到处理程序。他们通过IPC规则进行通信,一切正常 由于安全原因,不能将整个文件共享给请求者。在该文件中,仅允许请求程序进程访问某些部分 如果共享内存(仅是文件中允许的部分)和请求进程,将获

我有一个巨大的文件ie 1TiB作为“filehandler”拥有,允许使用rwx------。我将它映射到64位地址空间,并且所有操作都成功。此文件由以用户“filehandler”身份运行的进程处理

其他进程从以filehandler以外的其他用户身份运行的此处理程序进程请求服务。他们通过unix套接字登录到处理程序。他们通过IPC规则进行通信,一切正常

由于安全原因,不能将整个文件共享给请求者。在该文件中,仅允许请求程序进程访问某些部分

如果共享内存(仅是文件中允许的部分)和请求进程,将获得最佳性能

例如,shm为其他流程提供了访问段的密钥,这对请求者来说是一个实际的目标

有没有办法只将mmap(2)ed空间中允许的部分共享给shm技术等流程

有没有办法只将mmap(2)ed空间中允许的部分共享给shm技术等流程

TL;DR:没有


更详细地说,

如何在内存中重新映射文件mmap(2)-ed,如shmget

mmap()
shmget()
实际上并不具有可比性。一方面,将
shm_open()
/
ftruncate()
/
mmap()
与另一方面将
shmget()
/
shmat()
相结合,可以进行更好的比较。这些是POSIX中创建带标签的共享内存段并将其映射到进程地址空间的主要替代方法。您应该认识到,
shmget()
的模拟值是
shm_open()
,而在此上下文中
mmap()
的模拟值是
shmat()

现在,回到

有没有办法只将mmap(2)ed空间中允许的部分共享给shm技术等流程

请注意,在上述两种情况下,正是映射的对象(共享内存段)提供了无关进程之间的共享,而与
mmap()
本身无关。当
mmap()
映射任何其他类型的对象(例如常规文件)时,同样适用。它始终是作为任何共享访问中介的映射对象。必须这样做,因为内存映射是一个进程的属性——它本身不可共享


您的设计要求filehandler进程充当数据的守门人,而不是允许客户端直接访问数据。这很好,但是它阻止了客户端将文件映射到内存中。您可能会安排客户机通过任何一种风格的共享内存段访问数据,但这需要服务器将正确的数据从大文件复制到客户机的共享内存段中。这可能确实是一个需要考虑的问题,但是您可以忘记提供客户端对文件的直接内存映射访问的服务器。< /P> < P> >在实现< <代码> SMGET < /Cuff>系统调用(系统V AT&T派生实现)和<代码> MMAP>代码>(伯克利的BSD系统派生实现)之间没有连接。的确,在BSD系统中,AT&T共享内存是通过使用
mmap
ed私有段实现的,没有附加文件,但这也没有用,因为您需要将共享段与文件关联

根据需要,共享与文件内容相关的内存段的唯一可能性是使用
mmap
system调用,因为systemv共享内存段无法将文件与其关联

所有这些资源(SysV或BSD)都有一组与之相关联的权限位,允许它们在某种安全性下使用,但与文件一样,只能以全局(整个资源)的方式使用,使您能够访问整个内容,或者什么也不能访问

顺便说一句,您可以通过将段内容复制到另一个私有段(仅允许客户端查看的大小)以及只允许其访问的段来实现所需的功能,这样您就可以更好地控制允许客户端执行的操作

最后,请记住,这种方法需要复制共享内存段,因此,如果您不希望在客户端完成使用时丢失该客户端所做的修改,那么您需要记住为客户复制导出的内存段


从我的角度来看,您让事情变得有点复杂,但您比我更了解应用程序的设计。

您有任何selinux方面的顾虑吗?我没有。通过加密,安全性得到了足够的解决,但如果不是所有的内存段都可见,则安全性更高。内存段的不同部分无法获得不同的权限位。由于每个
mmap
d段都有一个相关的文件,权限与文件的权限位相关,因此您只能访问整个文件,或者根本无法访问任何内容,这取决于
mmap
读取文件时您是谁。@LuisColorado:调用
mmap
后,您可以
mprotect
munmap
映射的某些页面。但我认为这对IPC没有帮助,除非你
fork()
,然后让子进程
munmap
在放弃特权或其他东西之前使用它们不需要的部分。我认为你不能通过套接字来传递映射。恐怕这里的兴趣是只允许访问共享段的某个部分。。。。这不是你说的。资源作为一个整体共享,因此,如果您具有全局访问权限,则可以附加资源。但地区取决于你。。。你不能被阻止去mmap这个部分的某些部分,也不能被允许去其他部分。是的,我可以看到不可比性,而且我理解你的建议,这是一贯的