如何在不取消链接的情况下关闭 shm_open 文件描述符?

How do I close a shm_open file descriptor without unlinking it?

我有一个公共共享内存space,多个进程可以读取和写入它。我正在 运行 解决这个问题,我正在使用 shm_open() 访问共享内存并使用 mmap() 写入内存映射文件。但是,在调用我的包装器方法几次后,当我调用 shm_open().

时,我将 运行 变为 ERRNO 24(打开的文件过多)

我尝试使用 shm_unlink(),但这会关闭与共享内存 space 关联的名称,并且我无法再次访问具有关联名称的内存。如何关闭文件描述符并单独保留与共享内存关联的名称?

本质上,我希望包装函数执行此操作:

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 本机函数。

close 函数是关闭任何类型文件描述符的机制,包括引用共享内存的文件描述符。

参见 shm_open(3) — Linux 手册页

  1. 调用 mmap(2) 后,文件描述符可能会关闭而不影响内存映射。

  2. shm_unlink()的操作移除一个共享内存对象名,并..释放并销毁...