不允许此功能有充分的理由,尤其是从安全方面。 “share this mem” API 会颠覆访问权限系统。
假设应用程序在内存中保存了某种关键/敏感信息;应用程序链接(例如通过使用共享库、预加载、修改的链接器/加载器)到外部的任何组件,并且为了纯粹的乐趣而决定“共享地址空间”的所述组件。这将是一种免费的,一种绕过任何类型的数据访问权限/限制的方法。您可以通过隧道进入应用程序。
承认,这对您的用例不利,但从系统/应用程序完整性的角度来看是合理的。尝试在网络上搜索 /proc/pid/mem mmap 漏洞,了解为什么(一般而言)不需要这种访问。
如果您使用的库被设计为允许此类共享访问,则它必须自身提供挂钩以分配此类共享缓冲区,或使用其他地方预分配的(可能是共享的)缓冲区。
编辑:为了明确这一点,进程边界明确表示不共享地址空间(除其他外)。
如果您需要共享地址空间,请使用线程(然后共享整个地址空间,并且永远不需要“导出”任何内容),或者以与设置相同的方式显式设置共享内存区域共享文件。
从后者的角度来看,两个不打开它O_EXCL 的进程将共享对文件的访问。但是如果一个进程已经打开O_EXCL,那么“使其共享”(对另一个进程开放)的唯一方法是close()它首先然后open()它再次没有O_EXCL。除了先将其关闭之外,没有其他方法可以从您打开的文件中“删除”独占访问权限。
正如除了首先取消映射之外,没有其他方法可以删除对映射的内存区域的独占访问 - 对于进程的内存,MAP_PRIVATE 是默认值,这是有充分理由的。
更多:进程共享内存缓冲区实际上与进程共享文件没有太大区别;使用 SysV-IPC 风格语义,你有:
| SysV IPC 共享内存文件
===============+==================================== =================================
创作 | id = shmget(key,..., IPC_CREAT); fd = open("名称",...,O_CREAT);
查找 | id = shmget(key,...); fd = open("名称",...);
访问 | addr = shmat(id,...); addr = mmap(...,fd,...);
|
全球手柄 | IPC 密钥文件名
本地句柄 | SHM ID 号文件描述符号
内存位置 |由 shmat() 创建由 mmap() 创建
即关键是您正在寻找的“句柄”,以与传递文件名相同的方式传递,然后IPC连接的双方都可以使用该密钥来检查共享资源是否存在,以及在访问时(附加到句柄)的内容。