如何在不取消链接的情况下关闭 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 手册页
调用 mmap(2) 后,文件描述符可能会关闭而不影响内存映射。
shm_unlink()的操作移除一个共享内存对象名,并..释放并销毁...
我有一个公共共享内存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 手册页
调用 mmap(2) 后,文件描述符可能会关闭而不影响内存映射。
shm_unlink()的操作移除一个共享内存对象名,并..释放并销毁...