匿名共享内存

本章介绍 NSPR 用于匿名共享内存的 API。

匿名内存协议

NSPR 提供了一种基于 NSPR 的 PRFileMap 类型的匿名共享内存。匿名文件映射共享内存提供了一种可继承的共享内存,例如:子进程继承共享内存。将文件映射匿名共享内存与 prshm.h 中描述的命名共享内存进行比较。目的是提供一个仅供父进程和子进程访问的共享内存。…… 这是一个安全问题。

根据底层平台的不同,文件映射共享内存可能由文件支持。…… 意外!…… 在某些平台上,没有真正的文件支持共享内存。在共享内存由文件支持的平台上,文件系统中文件的名称仅在创建文件期间对其他进程可见,希望这段时间非常短。这限制了未继承共享内存的进程打开文件并读取或写入其内容。此外,当所有使用匿名共享内存的进程终止时,备份文件将被删除。…… 如果你不偏执,你就没有注意到。

文件映射共享内存需要一个协议,以便父进程和子进程共享内存。NSPR 提供了两种协议。使用其中一种;不要混用。

在第一个协议中,传递可继承共享内存的工作是通过带有 PR_CreateProcess 的辅助函数完成的。在第二个协议中,父进程负责创建子进程;父进程和子进程共同负责传递一个 FileMap 字符串。NSPR 提供了用于从 PRFileMap 对象中提取数据的辅助函数。…… 请参阅下面的示例。

双方都应严格遵守协议才能正常运行。下面的伪代码显示了父进程和子进程如何使用文件映射共享内存。在示例中,服务器创建文件映射共享内存,客户端连接到它。

第一个协议

服务器

fm = PR_OpenAnonFileMap(dirName, size, FilemapProt);
addr = PR_MemMap(fm);
attr = PR_NewProcessAttr();
PR_ProcessAttrSetInheritableFileMap( attr, fm, shmname );
PR_CreateProcess(Client);
PR_DestroyProcessAttr(attr);
... yadda ...
PR_MemUnmap( addr );
PR_CloseFileMap(fm);

客户端

... started by server via PR_CreateProcess()
fm = PR_GetInheritedFileMap( shmname );
addr = PR_MemMap(fm);
... yadda ...
PR_MemUnmap(addr);
PR_CloseFileMap(fm);

第二个协议

服务器

fm = PR_OpenAnonFileMap(dirName, size, FilemapProt);
fmstring = PR_ExportFileMapAsString( fm );
addr = PR_MemMap(fm);
... application specific technique to pass fmstring to child
... yadda ... Server uses his own magic to create child
PR_MemUnmap( addr );
PR_CloseFileMap(fm);

客户端

... started by server via his own magic
... application specific technique to find fmstring from parent
fm = PR_ImportFileMapFromString( fmstring )
addr = PR_MemMap(fm);
... yadda ...
PR_MemUnmap(addr);
PR_CloseFileMap(fm);

匿名共享内存函数