我有一个公共(public)的共享内存空间,多个进程可以读写它。我在使用 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 native 函数。
close
函数是关闭任何类型文件描述符的机制,包括引用共享内存的文件描述符。
我是一名优秀的程序员,十分优秀!