如何在没有持久文件的Linux中使用.NET内存映射文件?

问题描述 投票:0回答:1

在 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)之间共享内存。最好使用共享内存而不是套接字或管道,因为如果消费者不可用,我不希望数据在缓冲区中等待。

c# .net linux memory-mapped-files
1个回答
0
投票

看来有办法

/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);

C#(单声道)Linux 内存映射文件 - 共享内存(多进程)

© www.soinside.com 2019 - 2024. All rights reserved.