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

8
在UNIX世界中,创建一个由RAM或页面文件支持而不是磁盘文件的文件映射对象的标准方法是调用shm_open。这将创建一个带名称的内存映射,并返回一个文件句柄,您可以将其传递给mmap
问题在于它会创建一个名称。如果我能创建一个匿名内存映射就好了。这将解决两个问题:
1. 它将避免同一程序的两个实例互相干扰映射文件的问题。 2. 如果程序崩溃或突然终止,它将不会留下共享内存对象。立即调用shm_unlink是一种可能性,但这会在下一次重启之前留下一个小窗口,使得突然终止会在对象周围留下。
在Linux中,有memfd_create来解决这个问题。同样,在Windows中,可以将空名称传递给CreateFileMappingW来创建一个匿名映射。
在Mac OS中是否有相应的解决方案?

1
我认为你只需要使用MAP_ANONfd=-1调用mmap()函数 - 但以往我经常犯错 :-) - Mark Setchell
@MarkSetchell 很抱歉,这并不简单。这样的映射不能像文件句柄一样继承,也不能使用FD传递将句柄传递给另一个进程。 - Myria
1
哦,对不起!我没有从你的问题中意识到你需要这样做。 - Mark Setchell
@Myria,你应该在问题中提出这样的要求。此外,继承或传递机制是否必须是文件描述符?Mach的vm_*函数可以创建内存映射,然后将它们设置为可继承和/或传递给其他进程。 - Ken Thomases
1个回答

3
您可以使用open创建文件,然后立即使用unlink从文件系统中删除它。文件描述符仍然保持打开状态,并且文件本身在最后一个描述符关闭之前仍然存在。如果您需要在进程之间共享文件描述符,则可以使用此方法,并且它似乎解决了您列出的两个问题。
或者,将MAP_ANONMAP_SHARED传递给mmap,将创建一个未由任何文件支持但在此进程及其所有派生进程之间共享的共享内存区域。但是,像任何内存映射一样,在exec时会被删除。

调用 open 将违反要求2 - 如果在 openunlink 之间发生突然终止,它将留下一个文件。 正如上面的评论中所述,我忘记提到它还需要是FD。 - Myria
2
@Myria,我认为您将问题表述成了只有memfd_create是唯一可能的解决方案(也就是说,它必须是文件描述符,而且不能显示在文件系统上),但macOS没有此功能。 - zneak
1
那么答案就是它是不可能的,我可以关闭它了。 - Myria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接