我有一个公共的共享内存空间,多个进程可以对其进行读写。我正在使用shm_open()
访问共享内存,并使用mmap()
写入内存映射文件时遇到此问题。但是,在几次调用包装器方法后,调用ERRNO 24
时,我会遇到shm_open()
(打开的文件太多)的情况。
我尝试使用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本机函数。
答案 0 :(得分:2)
close
函数是用于关闭任何类型的文件描述符(包括引用共享内存的文件描述符)的机制。
答案 1 :(得分:0)
参见 shm_open(3) — Linux 手册页
在调用 mmap(2) 之后,文件描述符可能会被关闭,而不会影响内存映射。
shm_unlink() 的操作是删除一个共享内存对象名,然后..释放和销毁...