在 Linux 上使用 .NET (dotnet 5.0),
MemoryMappedFile.CreateFromFile()
可以工作(但不支持 mapName
),但 CreateNew()
和 CreateOrOpen()
和 OpenExisting()
会抛出 System.PlatformNotSupportedException: Named maps are not supported.
。由于不支持命名映射,这意味着仅支持持久文件支持的内存映射。
是否有某种方法可以在 Linux 上的 .NET 中获得基于内存的非持久 MMF?也许是一些 Mono 库,或者 NuGet 中的其他东西?或者甚至是使用
pinvoke
的工作示例?
我想在 Linux 中的 C# .NET 应用程序和其他一些应用程序(可能是 C、C++ 和/或 Python)之间共享内存。最好使用共享内存而不是套接字或管道,因为如果消费者不可用,我不希望数据在缓冲区中等待。
看来有办法
/dev/shm
:
持久性 POSIX 共享内存对象具有内核持久性: 共享内存对象将一直存在,直到系统关闭,或者 直到所有进程都取消映射该对象并将其删除 与 shm_unlink(3)
通过文件系统访问共享内存对象在Linux上,共享 内存对象在 (tmpfs(5)) 虚拟文件系统中创建, 通常安装在 /dev/shm 下。自从Linux 2.6.19、Linux 支持使用访问控制列表(ACL)来控制虚拟文件系统中对象的权限。
这应该有效:
MemoryMappedFile.CreateFromFile("/dev/shm/test", System.IO.FileMode.OpenOrCreate, "test", 100000);