Macos Mac OS有办法创建匿名文件映射吗?

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是一种可能性,但这会留下一个小窗口,在该窗口中,突然终止会使对象在下次重新

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

问题是它创建了一个名称。如果我能创建一个匿名内存映射就好了。这将解决两个问题:

  • 这将避免同一程序的两个实例可能会相互践踏映射文件的问题
  • 如果程序崩溃或突然终止,它将不会留下共享内存对象。在
    shm_open
    之后立即调用
    shm_unlink
    是一种可能性,但这会留下一个小窗口,在该窗口中,突然终止会使对象在下次重新启动之前一直存在
  • 在Linux中,有
    memfd\u create
    来解决这个问题。类似地,Windows允许向
    CreateFileMappingW
    传递空名称以创建匿名映射


    是否有适用于Mac OS的等效文件?

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


    或者,将
    MAP\u ANON
    MAP\u SHARED
    传递到
    mmap
    将创建一个共享内存区域,该区域不受任何文件支持,但在此进程及其所有分支之间共享。然而,就像任何内存映射一样,它在
    exec

    上被删除,我想你只需使用
    MAP\u ANON
    fd=-1
    ,就可以执行
    mmap()。这样的映射不能作为文件句柄继承,也不能使用FD传递将句柄赋予另一个进程。哦,对不起!我从你的问题中没有意识到你需要这样做。@Myria,你应该在问题中提出这样的要求。此外,继承或传递的机制必须是文件描述符吗?Mach
    vm.*
    函数可以创建内存映射,然后将它们设置为继承和/或传递给其他进程。调用
    open
    将违反要求2-如果在
    open
    unlink
    之间突然终止,则会留下一个文件。在上面的评论中,我忘了提到它也需要是一个FD。@Myria,在我看来,你用一种方式表述这个问题,唯一可能的解决方案是
    memfd\u create
    (也就是说:它必须是一个文件描述符,并且不能在文件系统上显示),而macOS没有。然后答案是这是不可能的,然后我可以把它关上。