【问题标题】:How do I close a shm_open file descriptor without unlinking it?如何在不取消链接的情况下关闭 shm_open 文件描述符?
【发布时间】:2019-05-19 11:14:02
【问题描述】:

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

【问题讨论】:

  • 您是否考虑过只保留已映射的段,而不是一次又一次地打开和映射它?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    参见 shm_open(3) — Linux 手册页

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

    2. shm_unlink() 的操作移除了一个共享内存对象名,并且..解除分配和销毁...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多