Mac OS是否有办法创建匿名文件映射?

时间:2016-09-29 20:34:19

标签: macos shared-memory memory-mapped-files

在UNIX世界中,创建由RAM或页面文件而不是磁盘文件支持的文件映射对象的标准方法是调用shm_open。这将创建一个带有名称的内存映射,并返回一个可以传递给mmap的文件句柄。

问题在于它创建了一个名称。如果我可以创建匿名内存映射会很好。这将解决两个问题:

  1. 这可以避免同一程序的两个实例可能会相互踩踏映射文件的问题。
  2. 如果程序崩溃或突然终止,它将不会留下共享内存对象。在shm_unlink之后立即调用shm_open是一种可能性,但是这留下了一个小窗口,在该窗口中突然终止会使对象离开,直到下次重新启动。
  3. 在Linux中,有memfd_create来解决此问题。同样,Windows允许将空名称传递给CreateFileMappingW以创建匿名映射。

    是否有Mac OS的等效产品?

1 个答案:

答案 0 :(得分:1)

您可以使用open创建文件,然后立即使用unlink将其从文件系统中删除。文件描述符将保持打开状态,文件本身将保持活动状态,直到其最后一个描述符关闭。如果您需要在进程之间共享文件描述符,这可以解决您列出的两个问题。

或者,将MAP_ANONMAP_SHARED传递给mmap会创建一个共享内存区域,该区域不受任何文件的支持,但会在此进程及其所有分支之间共享。但是,与任何内存映射一样,它会在exec上删除。