Mac OS是否可以创建匿名文件映射?

Myr*_*ria 5 macos shared-memory memory-mapped-files

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

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

  1. 这样可以避免出现以下问题:同一程序的两个实例可能会占用彼此的映射文件。
  2. 如果程序崩溃或突然终止,它将不会留下共享内存对象。在此shm_unlink之后立即调用shm_open是一种可能,但是这会留下一个小窗口,在该窗口中突然终止会将该对象保留到下次重新启动为止。

在Linux中,有memfd_create解决此问题的方法。同样,Windows允许传递一个空名称CreateFileMappingW来创建匿名映射。

Mac OS是否具有等效功能?

zne*_*eak 3

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

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

  • @Myria,在我看来,你以一种唯一可能的解决方案是“memfd_create”的方式来表达问题(即:它必须是一个文件描述符,并且它不能在文件系统上显示),macOS没有。 (2认同)