Macos Mac OS有办法创建匿名文件映射吗?
在UNIX世界中,创建由RAM或pagefile而不是磁盘文件支持的文件映射对象的标准方法是调用Macos Mac OS有办法创建匿名文件映射吗?,macos,shared-memory,memory-mapped-files,Macos,Shared Memory,Memory Mapped Files,在UNIX世界中,创建由RAM或pagefile而不是磁盘文件支持的文件映射对象的标准方法是调用shm\u open。这将创建一个带有名称的内存映射,并返回一个可以传递给mmap的文件句柄 问题是它创建了一个名称。如果我能创建一个匿名内存映射就好了。这将解决两个问题: 这将避免同一程序的两个实例可能会相互践踏映射文件的问题 如果程序崩溃或突然终止,它将不会留下共享内存对象。在shm_open之后立即调用shm_unlink是一种可能性,但这会留下一个小窗口,在该窗口中,突然终止会使对象在下次重新
shm\u open
。这将创建一个带有名称的内存映射,并返回一个可以传递给mmap
的文件句柄
问题是它创建了一个名称。如果我能创建一个匿名内存映射就好了。这将解决两个问题:
shm_open
之后立即调用shm_unlink
是一种可能性,但这会留下一个小窗口,在该窗口中,突然终止会使对象在下次重新启动之前一直存在memfd\u create
来解决这个问题。类似地,Windows允许向CreateFileMappingW
传递空名称以创建匿名映射
是否有适用于Mac OS的等效文件?您可以使用
打开
创建一个文件,然后使用取消链接
立即将其从文件系统中删除。文件描述符将保持打开状态,文件本身将保持活动状态,直到最后一个描述符关闭。如果您需要一个文件描述符在进程之间共享,并且它似乎可以解决您列出的两个问题,那么这种方法是有效的
或者,将
MAP\u ANON
和MAP\u SHARED
传递到mmap
将创建一个共享内存区域,该区域不受任何文件支持,但在此进程及其所有分支之间共享。然而,就像任何内存映射一样,它在exec
上被删除,我想你只需使用MAP\u ANON
和fd=-1
,就可以执行mmap()。这样的映射不能作为文件句柄继承,也不能使用FD传递将句柄赋予另一个进程。哦,对不起!我从你的问题中没有意识到你需要这样做。@Myria,你应该在问题中提出这样的要求。此外,继承或传递的机制必须是文件描述符吗?Machvm.*
函数可以创建内存映射,然后将它们设置为继承和/或传递给其他进程。调用open
将违反要求2-如果在open
和unlink
之间突然终止,则会留下一个文件。在上面的评论中,我忘了提到它也需要是一个FD。@Myria,在我看来,你用一种方式表述这个问题,唯一可能的解决方案是memfd\u create
(也就是说:它必须是一个文件描述符,并且不能在文件系统上显示),而macOS没有。然后答案是这是不可能的,然后我可以把它关上。