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

时间:2018-12-19 00:48:03

标签: c# c embedded-linux shared-memory memory-mapped-files

我有一个公共的共享内存空间,多个进程可以对其进行读写。我正在使用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本机函数。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

参见 shm_open(3) — Linux 手册页

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

  2. shm_unlink() 的操作是删除一个共享内存对象名,然后..释放和销毁...

相关问题