【发布时间】:2019-05-19 11:14:02
【问题描述】:
我有一个公共共享内存空间,多个进程可以对其进行读写。我遇到了这个问题,我使用shm_open() 访问共享内存并使用mmap() 写入内存映射文件。但是,在对我的包装方法进行几次调用后,当我调用shm_open() 时,我会遇到ERRNO 24(打开的文件太多)。
我尝试使用shm_unlink(),但这会关闭与共享内存空间关联的名称,并且我无法再次使用关联名称访问该内存。如何关闭文件描述符并保留与共享内存关联的名称?
基本上我希望包装函数这样做:
public static void Write(string name, int size, int offset, List<byte> data)
{
int fd = shm_open(name, O_RDWR, S_IWUSR | S_IWOTH);
if(fd < 0) { // throw error }
IntPtr *ptr = mmap(null, shmSize, PROT_WRITE, MAP_SHARED, fd, 0);
if(ptr < 0) { // throw error }
foreach(byte in data) { // write to shared memory }
munmap(ptr, shmSize);
shm_close(fd) // <-- I want to do equivalent of this
}
让事情变得更复杂一些。我在 Linux 环境中使用 C# 进行开发,并使用 DLL 导入来调用 Linux 本机函数。
【问题讨论】:
-
您是否考虑过只保留已映射的段,而不是一次又一次地打开和映射它?
标签: c# c embedded-linux shared-memory memory-mapped-files